html5游戏开发RabbitEscape:完成游戏

上传人:宝路 文档编号:23262227 上传时间:2017-11-30 格式:DOC 页数:15 大小:111.01KB
返回 下载 相关 举报
html5游戏开发RabbitEscape:完成游戏_第1页
第1页 / 共15页
html5游戏开发RabbitEscape:完成游戏_第2页
第2页 / 共15页
html5游戏开发RabbitEscape:完成游戏_第3页
第3页 / 共15页
html5游戏开发RabbitEscape:完成游戏_第4页
第4页 / 共15页
html5游戏开发RabbitEscape:完成游戏_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《html5游戏开发RabbitEscape:完成游戏》由会员分享,可在线阅读,更多相关《html5游戏开发RabbitEscape:完成游戏(15页珍藏版)》请在金锄头文库上搜索。

1、html5 游戏开发 Rabbit Escape:完成游戏一、前言上一篇教程中我们已经解决了游戏中的核心问题如何实现兔子的寻路移动。但是我们还没有添加游戏的成功失败判断和积分的管理,这次教程我们来完善它。二、GameCtrl 类中添加游戏的成功和失败判定,积分管理关于游戏的成功和失败判定,首先我们需要在头文件中添加相应的成员函数。12345public:/判断成功bool judgeSuccess();/判断失败bool judgeFail();关于游戏成功,玩过神经猫的童鞋都应该知道,只要将猫围住就算赢了,同比我们的游戏,只要将兔子围住就可以了。12bool GameCtrl:judgeSu

2、ccess()/获取当前可遍历的方向34567891011vector moveDirs;this-getCurDirs(moveDirs,m_rabbitPos);for (auto it:moveDirs) if (!m_gameMapm_rabbitPos.ver+it-verm_rabbitPos.hor+it-hor-isObt)return false;return true;实现起来的话,遍历当前兔子可以移动到的位置是不是都是障碍就行了,如果都是说明成功了,否则则没有成功。关于游戏失败,只要当兔子此时的位置只要到达任意一条边界边上,则就说明兔子成功的逃脱了,游戏也失败了。1234

3、56bool GameCtrl:judgeFail()if (m_rabbitPos.hor=0|m_rabbitPos.ver=0|m_rabbitPos.hor=NUM_MAPROWANDCOW-1|m_rabbitPos.ver=NUM_MAPROWANDCOW-1) return true; return false;ok,我们已经添加了完了成功和失败的判定,现在我们来添加积分的管理。分析一下,在这个游戏中积分是什么,其实就是兔子移动的次数(step)。如果你能在兔子移动越少的情况下将兔子围住,当然就说明你越牛 X。在头文件中添加响应的成员变量和接口函数:123456/当前移动步数in

4、t m_step;public:/得到当前移动步数int getStep()return m_step;什么时候 step 增加呢?肯定是兔子移动的时候啊,我们修改下rabbitMove 函数:123int GameCtrl:rabbitMove() Dir d = this-getRabbitMoveDir();if (Dir:none!=d) 45678910111213/增加移动次数m_step+;m_rabbitPos=(*m_moveVec(int)d)+m_rabbitPos;return m_rabbitPos.ver*NUM_MAPROWANDCOW+m_rabbitPos.h

5、or;elsereturn VAL_MAX;三、HelloWorld 中添加游戏成功和失败的部分首先修改之前,我们需要重新梳理一下游戏的逻辑流程。在添加了成功和失败判定部分后,我们游戏的逻辑流程应该是变成这样的:在每次触摸响应后:1.判断是否当前状态已经失败,如果是,则 xxx2.添加障碍3.判断是否当前状态已经成功,如果是,则 xxx4.兔子移动(游戏的逻辑流程是非常重要的,如果错了,那么整个游戏的运行方式将会发生很大的变化。 )有了上面的基础我们来修改一下触摸响应函数,这里假设成功和失败后先让它们显示 MessageBox 然后重新加载场景。1234567891011121bool Hel

6、loWorld:onTouchBeganCallBack(Touch *t, Event* event)for (auto it =m_pNodes_obstacle.begin();it!=m_pNodes_obstacle.end() ; it+) if(*it)-getBoundingBox().containsPoint(t-getLocation()&(!(*it)-isVisible()/判断是否失败if (m_ctrl-judgeFail() MessageBox(没办法,AI 就是任性 , =.=,兔子跑了!);Director:getInstance()-replaceSce

7、ne(HelloWorld:createScene();/add obt3141516171819202122232auto pObt = (*it);pObt-setVisible(true);m_ctrl-addObtacle(pObt-getTag();/判断是否胜利if (m_ctrl-judgeSuccess() MessageBox(Success, orz,兔子被围!);Director:getInstance()-replaceScene(HelloWorld:createScene();/rabbit moveint moveTag = m_ctrl-rabbitMove()

8、;if(m_pNodes-getChildByTag(moveTag)m_pNode_rabbit-runAction(MoveTo:create(0.1, m_pNodes-getChildByTag(moveTag)-getPosition();break;return false;425262728293031现在再编译运行一下,就会发现,当兔子被我们围住或者成功逃脱后就会有了成功和失败的判定。四、HelloWorld 中添加积分管理的部分关于积分管理,这里我会用到一个 Cocos2d-x 中的用户数据管理 UserDefault 来管理玩家的最好成绩。首先在头文件中添加两个 strin

9、g key:12const string STR_STEP = Step:; /step 的 keyconst string STR_BEST = Best:; /bestStep 的 key然后在 AppDelegate.cpp 中初始化用户数据中最好成绩的值:1234/set user dataif (0=UserDefault:getInstance()-getIntegerForKey(STR_BEST.c_str() UserDefault:getInstance()-setIntegerForKey(STR_BEST.c_str(),VAL_MAX);还需要修改一下触摸响应函数判定

10、成功后的部分,使其能够修改最好成绩,并且在 MessageBox 上面显示出来。12345678/判断是否胜利if (m_ctrl-judgeSuccess() if (UserDefault:getInstance()-getIntegerForKey(STR_BEST.c_str()m_ctrl-getStep() UserDefault:getInstance()-setIntegerForKey(STR_BEST.c_str(), m_ctrl-getStep();9101112/设置 messageBox 上面显示的信息char str_info60;sprintf(str_info

11、, 当前成绩为: %d,最好成绩为: %d,m_ctrl-getStep(),UserDefault:getInstance()-getIntegerForKey(STR_BEST.c_str();MessageBox(str_info, orz,兔子被围!);Director:getInstance()-replaceScene(HelloWorld:createScene();ok,接下来我们会让两个分数显示到 UI 上面。这里再次会涉及到 Cocos2d-x 和 Cocos Studio 两者之间的联系,需要使用 UI:Text 组件将其联系起来,添加响应的成员变量和成员函数。12345

12、6/Step TextText* m_pText_curStep;/BestStep TextText* m_pText_bes78tStep;/设置 Textvoid setText(Text* pTxt,int num);讲一个实用技巧吧,这里我们可以观察下 Cocos Studio 相对应控件属性的类型值。可以对应到 UI 命名空间中同名控件,来实现两者的联系。在 init 方法中获取 Text123/获取 UITEXTm_pText_curStep = m_pNodes-getChildByName(Text_curStep);m_pText_bestStep = m_pNodes-g

13、etChildByName(Text_bestStep);我使用了一个 setText 的方法来设置他们的文本信息12void HelloWorld:setText(Text* pTxt,int num)3456789101112131415161std:stringstream stream;streamstr;if(m_pText_curStep=pTxt)pTxt-setString(STR_STEP+str);else/如果不是第一次设置,则设置成对应值if(num!=VAL_MAX)pTxt-setString(STR_BEST+str);elsepTxt-setString(STR

14、_BEST);71819C+的 sstream 可以实现 int 和 string 的转换(这里也可以使用 Cocos2d-x 中的数据结构 Value 实现,童鞋们可以思考一下) 。我们还需要在适当的时候调用这个方法,场景进入(onEnter)以及兔子移动的时候。123456789101void HelloWorld:onEnter()Layer:onEnter();/生成 12 个障碍this-setRandStones(12);/设置 UI 上面 Textthis-setText(m_pText_curStep,m_ctrl-getStep();this-setText(m_pText_

15、bestStep,UserDefault:getInstance()-getIntegerForKey(STR_BEST.c_str();/rabbit move11213141516int moveTag = m_ctrl-rabbitMove();if(m_pNodes-getChildByTag(moveTag)m_pNode_rabbit-runAction(MoveTo:create(0.1, m_pNodes-getChildByTag(moveTag)-getPosition();/设置 Textthis-setText(m_pText_curStep,m_ctrl-getStep();最后,是不是觉得每次障碍每次好像“假随机”一样总是生成到相同的位置,总是 12 个石头让人很不爽。没事,我们来给它在 app 类的初始化方法中添加设置随机种子的函数,让它变成个“真随机。123456/set randsrand(time(NULL);然后,需改一下生成随机障碍的部分,让它每次生成不同数目的障碍。const int NUM_INITSTONE = 8; /至少 8 个障碍const int

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号