Html5 Egret游戏开发 成语大挑战(七)游戏逻辑和数据处理
本篇在前面的基础上,将进行逻辑的编码开发让游戏能够正式的玩起来,这里没有注重太多的体验细节,而是直接实现游戏的规则逻辑,将分成两个部分说明:数据处理和游戏逻辑。
初始化游戏数据
在前面的第五篇中,我们通过数据的构建已经读取了所有的关卡数据在关卡选择界面中,LevelDataManager负责管理所有的关卡数据,在SceneLevels类中,当onclick_level触发时,就会切换到Game界面中,所以改造代码如下:
private onclick_level(e:egret.TouchEvent){
var icon = <LevelIcon>e.currentTarget;
if(this.sel_level != icon.Level){
this.img_arrow.x = icon.x;
this.img_arrow.y = icon.y;
this.sel_level = icon.Level;
}else{
//进入并开始游戏
this.parent.addChild(SceneGame.Shared());
SceneGame.Shared().InitLevel(icon.Level);
this.parent.removeChild(this);
}
}
还记得单例吗?不明的可以去看一下前面第五篇,此时InitLevel方法还没有实现,实现SceneGame类,并添加InitLevel方法:
class SceneGame extends eui.Component {
//单例
private static shared: SceneGame;
public static Shared() {
if(SceneGame.shared == null) {
SceneGame.shared = new SceneGame();
}
return SceneGame.shared;
}
public constructor() {
super();
this.skinName = "src/Game/SceneGameSkin.exml";
this.btn_back.addEventListener(egret.TouchEvent.TOUCH_TAP,this.onclick_back,this);
}
//对象变量
private group_answer:eui.Group;
private group_words: eui.Group;
private img_question: eui.Image;
private btn_back: eui.Group;
private levelIndex:number;
//初始化关卡
public InitLevel(level:number){
this.levelIndex = level;
var leveldata = LevelDataManager.Shared().GetLevel(level);
}
private onclick_back(){
this.parent.addChild(SceneLevels.Shared());
this.parent.removeChild(this);
}
}
参数传入的是关卡数值,因为我们已经有了数据管理类,不需要去从外部获得,现在有了对应的关卡数据,就可以构建游戏了,为了后面的设计操作,我们将现在正在进行的关卡保存到一个自定义变量中就是 this.levelIndex,将来它将帮我们完成换关卡之类的操作。
但是此时我们发现一个问题,就是关卡中的选择“字”是20个,而关卡数据中是10个(4+6),这样不够我们放置的怎么办呢?有一个很简单的办法,随机另外一个题目将问题答案和本题组合,然后打乱字符顺序,就可以了,当然如果为了减少难度,也可以将问题设计成为10个“问题字”,这里采用的是20个“问题字”来保证难度的一致,下面改造InitLevel方法:
//初始化关卡
public InitLevel(level:number){
this.levelIndex = level;
var leveldata = LevelDataManager.Shared().GetLevel(level);
//将字段接起来
var words = leveldata.answer + leveldata.word;
//随机一个其它题目的字段混合进本题目
while(words.length==10){
var i = Math.floor(Math.random() * 400);
if(i!=level){
var temp = LevelDataManager.Shared().GetLevel(i);
words += temp.word + temp.answer;
}
}
//对字段重排
var wordlist:string[]=[];
for(var i =0 ;i<words.length;i++){
wordlist.push(words.charAt(i));
}
wordlist = this.randomlist(wordlist);
//赋值
for(var i = 0;i<this.group_words.numChildren;i++){
var wordrect = <Word>this.group_words.getChildAt(i);
wordrect.setWordText(wordlist[i]);
wordrect.visible = true;
}
//重置一些状态
for(var i = 0;i<this.group_answer.numChildren;i++){
var answerrect = <AnswerWord>this.group_answer.getChildAt(i);
answerrect.SetSelectWord(null);
answerrect.visible = true;
answerrect.SelectWord = null;
}
//显示图像
this.img_question.source = "resource/assets/"+leveldata.img;
}
//将一个数列随机
private randomlist(arr: any[]): any[] {
var array = [];
while(arr.length > 0) {
var i = Math.floor(Math.random() * arr.length);
array.push(arr[i]);
arr.splice(i,1);
}
return array;
}
在最后增加了一个自己写的randomlist方法,是将一个数组打乱顺序,上面的注释基本上已经将代码讲完,需要注意的是AnswerWord的SetSelectWord方法,在之前的代码中,没有对null进行处理,所以还得修改AnswerWord.SetSelectWord(word:Word):
//当一个问题字被选择添加到回答的时,设置不可见,并保存到本对象中以后使用
public SetSelectWord(word:Word){
if(word != null){
this.setWordText(word.getWordText());
this.SelectWord = word;
word.visible = false;
}
else{
this.setWordText("");
this.SelectWord = null;
}
}
这个方法的作用就是,下面的问题字操作的时候,将其保存在回答字中,将来再操作时将其还原显示。
字块操作处理逻辑
打开Word类,本游戏的字块是独立的,几乎不会变化,所以我们将点击事件放入对象自身处理,通过访问Game类的单例来让代码看起来更好读一些,所以,直接修改onclick_tap方法如下:
protected onclick_tap(){
SceneGame.Shared().onclick_word(this);
}
然后在SceneGame实现onclick_word方法,传入参数是word:
//当字点击的时候,由word类抛出
public onclick_word(word: Word){
//找到一个合适的位置添加进答案内容
var sel:AnswerWord = null;
for(var i = 0;i<this.group_answer.numChildren;i++){
var answer = <AnswerWord>this.group_answer.getChildAt(i);
if(answer.SelectWord == null){
sel = answer; break;
}
}
//当有一个合适的位置的时候就会将字填充,并判断是否胜利
if(sel != null){
sel.SetSelectWord(word);
//判断是否胜利
var check_str:string = "";
for(var i = 0;i < this.group_answer.numChildren;i++) {
var answer = <AnswerWord>this.group_answer.getChildAt(i);
check_str += answer.getWordText();
}
if(check_str == LevelDataManager.Shared().GetLevel(this.levelIndex).answer){
//胜利
console.log("win");
}
}
}
如果没有找到合适添加位置的话,就没有任何操作,这个逻辑已经基本完成,可以运行起来看看效果,将开始界面加到Main中:
protected startCreateScene(): void {
//this.addChild(SceneBegin.Shared());
this.addChild(SceneLevels.Shared());
}
然后一路点进游戏界面,就可以达到你想要效果了。

本篇已经结束,使用了点击事件和互相调用的方式来实现基本的规则处理,由于篇幅问题,还有很多东西没有实现,因此在此之后增加一篇二级页面的讲解。
本篇项目源码:ChengyuTiaozhan4.zip(由于博客园的文件大小限制,resource资源方面请到第二篇的后面下载)
Html5 Egret游戏开发 成语大挑战(七)游戏逻辑和数据处理的更多相关文章
- Html5 Egret游戏开发 成语大挑战(一)开篇
最近接触了Egret白鹭引擎,感觉非常好用,提供了各种各样的开发工具让开发者和设计者更加便捷,并且基于typescript语言开发省去了很多学习成本,对于我们这种掉微软坑许久的童鞋来说,确实很有吸引力 ...
- Html5 Egret游戏开发 成语大挑战(二)干净的eui项目和资源准备
现在我们使用egret来起步开发一个名叫<成语大挑战>的小游戏,关于egret的开发环境就不在这里啰嗦了,直接去官方下载安装就可,egret是我见过开发环境部署最简单的解决方案,这个系列教 ...
- Html5 Egret游戏开发 成语大挑战(八)一般性二级页面处理
在游戏中,我们一般会有各种各样的二级页面,比如游戏暂停界面或者游戏结束界面,这些界面组成了对玩家交互主要手段,在游戏开发中,对于这些界面的coding组织是非常有学问的,如果倒退到十年前,游戏开发的老 ...
- Html5 Egret游戏开发 成语大挑战(六)游戏界面构建和设计
本篇将主要讲解游戏界面的构建和设计,会应用到egret.eui的自定义组件,可以很直观的构建一个游戏整体,这里我们仍然只需要使用EgretWing就可以达到目的,本篇可能是篇幅最少的一个,但是涉及自定 ...
- Html5 Egret游戏开发 成语大挑战(九)设置界面和声音管理
在上一篇中,简单的使用界面元素快速实现了一个游戏中的二级页面,这种直接在游戏页面上做UI的做法并不太好,原因是,UI会让游戏的压力变大,即使它是隐蔽的,如果同样的功能在其它的地方也是一样的,那么就要写 ...
- Html5 Egret游戏开发 成语大挑战(四)选关界面
通过前面的开始界面基本上了解了eui的使用方法,可以简单快速的制作一个UI界面,本篇使用第二界面选关界面展示更为难一点的代码控制,来展现关卡地图的内容,请确保素材和资源完整,可以在前面的教程中找到下载 ...
- Html5 Egret游戏开发 成语大挑战(三)开始界面
本篇需要在前面的素材准备完毕,才可以开始,使用egret的eui结合代码编辑,快速完成基本的界面搭建,这里写的可能比较细,目的是减少大家对于其中一些操作疑问,我去掉了很多无用的步骤,以最精简的流程来完 ...
- Html5 Egret游戏开发 成语大挑战(五)界面切换和数据处理
经过前面的制作,使用Egret的Wing很快完成了开始界面和选关卡界面,下面通常来说就是游戏界面,但此时界面切换和关卡数据还没有准备好,这次讲解界面的切换和关卡数据的解析.前面多次修改了Main.ts ...
- 6、Cocos2dx 3.0游戏开发找小三之游戏的基本概念
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27689713 郝萌主友情提示: 人是习惯的产物,当你 ...
随机推荐
- 【原】iOS优秀开源项目总结
网上此类帖子博客不少,不过自己没整理过的东西始终是别人,现开此贴加以总结,持续更新!站在巨人的肩膀上才能站得高看得远. 第一部分:UI类 1.毛玻璃模糊效果 RNFrostedSidebar 一个iO ...
- iOS中的过期方法和新的替代方法
关于iOS中的过期方法和新的替代方法 1.获取某些类的UINavigationBar的统一外观并设置UINavigationbar的背景 注:方法名改了但是基本使用方法不变 + (instancety ...
- iOS之 opencv3.0.framework
本文章的目的是从源代码包中编译出opencv2.framework供IOS开发使用. 基本上是按照http://docs.opencv.org/3.0-beta/doc/tutorials/intro ...
- Visio作图
1.Microsoft Visio介绍 Visio是一款便于IT和商务专业人员就复杂信息.系统和流程进行可视化处理.分析和交流的软件,也是Microsoft Office办公软件家族中的一个绘图工具软 ...
- XMLA连接器--免费但不开源通过ODBO、XMLA
XMLA 连接器(驱动) :来自ARQUERY http://jaist.dl.sourceforge.net/project/xmlaconnect/XMLA_Provider_v1.0.0.1 ...
- Asp.net MVC使用Model Binding解除Session, Cookie等依赖
上篇文章"Asp.net MVC使用Filter解除Session, Cookie等依赖"介绍了如何使用Filter来解除对于Session, Cookie的依赖.其实这个也可以通 ...
- Asp.net MVC验证那些事(1)-- 介绍和验证规则使用
数据的有效性验证,是程序开发中必不可少的环节.这篇文章,我们将用一个实例来说明如何在MVC中使用Validation来保证无论是新增或者更新数据的时候,都必须符合我们定义的验证规则,否则就会提示错误. ...
- SQL Server(九)——事务
事务: 保障流程的完整执行,就像银行取钱,先在你账上扣钱,然后存入别人的账上:但是从你账上扣完钱了,突然网断了,对方没有收到钱,那么此时你的钱也没了,别人的钱也没加上,事务为了防止此类情况的出现. 事 ...
- Sql Server之旅——第八站 复合索引和include索引到底有多大区别?
周末终于搬进出租房了,装了宽带....才发现没网的日子...那是一个怎样的与世隔绝呀...再也受不了那样的日子了....好了,既然网 安上去了,还得继续我的这个系列. 索引和锁,这两个主题对我们开发工 ...
- 0016 Java学习笔记-异常-如果try-catch-finally中都存在return语句会怎样?
上午在搜索"System.runFinalization"的时候,搜到 http://www.cnblogs.com/Skyar/p/5962253.html ,其中有关于try- ...