下面我们开始最后一篇文章,完成我们的飞行射击游戏。

有了前面的基础,相信现在你对Cocos2d的基本元素和编写技巧有了一定的了解,这回我们要接触的是场景切换,我们这回只列出部分代码,说明原理,给读者一个自由发挥的空间。

还记得我们最开始介绍的时候说的吧,任何时刻只有一个场景呈现给用户,当切换场景的时候,前一个场景的所有资源会被全部释放掉。

类似于GameScene和GameLayer的关系,我们同样不直接定义StartScene和GameOverScene,而是定义StartLayer和GameOverLayer,然后添加静态方法返回包含Layer的CCScene。

我们通过[CCDirectorsharedDirector]的replaceScene方法来从现有场景切换到replaceScene的参数指定的场景。例如,我们在startLayer中调用下面的语句来切换到GameScene:

[[CCDirectorsharedDirector] replaceScene:[GameLayer scene]];

我们希望在StartLayer上面,玩家点击之后就能够开始游戏,也就是玩家点击之后,执行上面的切换场景的语句。

如何实现点击呢,首先我们需要在startLayer中重写onEnterTransitionDidFinish方法:

- (void)onEnterTransitionDidFinish

{

[[[CCDirectorsharedDirector] touchDispatcher] addTargetedDelegate:self priority:1swallowsTouches:YES];

}

这个方法在startScene完成加载之后被调用,在这个方法里面我们调用touchDispatcher添加一个代理,响应touch事件的类必须遵循CCTouchAllAtOnceDelegate协议(Protocal)或者CCTouchOneByOneDelegate协议,因为我们的startLayer继承自CCLayer,而CCLayer遵循上面两个协议,所以我们可以将self作为addTargetedDelegate的参数,这样在得到玩家触摸或点击事件后,我们的startLayer能够得到通知并响应这个事件。

接着我们需要在startLayer中重写另一个方法:

- (void) onExit

{

[[[CCDirectorsharedDirector] touchDispatcher] removeDelegate:self];

}

在当前场景退出的时候,我们将代理删除掉,保证touch事件能够继续传递。

那么我们用什么方法响应触摸事件呢,我们重写ccTouch方法:

-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{

//CGPoint location = [[CCDirector sharedDirector] convertToGL:[touchlocationInView:[touch view]]];

[[CCDirector sharedDirector] replaceScene:[GameLayer scene]];   }

return YES;

}

注释掉的语句说明了我们如何通过参数touch来获取用户点击或者触摸的位置。除此之外我们还可以重载下面的七个方法满足我们不同的设计需要:

-(void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event;

-(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event;

-(void)ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event;

-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

-(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

-(void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

-(void)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

其中touches命名的4个方法对应多点触控这个硬件特性。

在从GameScene切换到GameOverLayer的时候需要注意的一个小细节,我们在本篇文章开头说过,切换场景的时候,前一个场景的所有资源都释放掉了,所以在GameOverLayer中,我们无法取得玩家的得分情况,这就要求我们改写GameOverLayer的初始化方法,将玩家的得分作为参数传递过来。

另外细心地读者已经发现了,我们的startLayer在第一篇文章的截图里看,有难度选择的按钮,这个制作的思路是,用三个CCSprite创建三个按钮代表三个难度选项,再用一个额外的CCSprite创建选择框,在ccTouch方法中做一下判断,如果用户的touchlocation在三个难度选项对应的CCSprite对象范围内,则切换难度而不开始游戏,如果用户的touchlocation在难度选项对应的CCSprite对象范围外,则切换场景开始游戏。同样,我们应该将“难度”作为参数传递给GameLayer,并且GameLayer在初始化的时候应该根据传入的难度参数设置不同的游戏参数。

到这里,关于这个游戏的所有编码都已经介绍完毕,有兴趣的读者可以继续为游戏添加背景音乐,依然是用SimpleAudioEngine这个类,还可以在startScene和gameScene之间添加一个LoadingScene,由于篇幅限制,就不在这里多说了,关于代码优化的地方也不一一列举了,有经验的读者可以在这个基础上进行一些必要的重构,包括可以将背景层抽象出来作为单独的类,这样在startLayer中的背景也可以复用这些代码,对于GameLayer中的一些代码也可以做进一步的优化,对于较长的函数可以分解等等,总之代码还有很多不完善的地方,欢迎留言批评指正。另外在开发的过程中,可以使用xcode自带的instruments工具进行内存分析等等。

好了就到这里,感谢耐心的阅读,我知道粘代码是特别不好的习惯,但是在没法上传代码文件还要把问题说明白的前提下,这也是无奈之举T_T。

呼,终于完成了第一篇连载技术贴,写的手酸脑袋疼,如果觉得不错,麻烦大家帮忙推荐点赞,有问题欢迎留言,也欢迎加加博友~

手把手教你开发一款IOS飞行射击游戏(完)相关推荐

  1. [air for ios] 三小时开发一个iOS飞行射击游戏

    [air for ios] 三小时开发一个iOS飞行射击游戏 http://www.badyoo.com/index.php/2012/07/04/158/index.html 2012-07-04 ...

  2. 手把手教你开发一款简单的AR软件

    文章最早发布于我的微信公众号中,欢迎关注公众号 Android_De_Home 获取更多干货资源. 本文为sydMobile原创文章,可以随意转载,但请务必注明出处! 这篇文章主要是分享怎么开发一款最 ...

  3. 手把手教你开发一款属于自己的Arduino开发板

    [前言] 相信很多小伙伴们手里都一块或者几块开发板吧,没有没想过自己也开发一款开发板呢?接下来就教你开发一款属于自己的开发板吧(●'◡'●). [软件版本] AD17 [正文] 1. 硬件选型 1.1 ...

  4. 手把手教你开发一款1024程序员节日历提醒服务

    目录 前言 正文 一.主动查询 1. 准备节日数据集 2. 定义查询接口 3. 查询服务 4. 接口演示 二.回调通知 结尾 前言 关于这次程序员节1024征文的内容,自己确实想了好久,作为一名后端研 ...

  5. 物联网开发实战:手把手教你开发一款久坐提醒小助手

    大家好,我是机灵鹤. 最近研究开发了一个物联网 IoT 小项目--久坐提醒 / 喝水提醒小助手. 1. 项目介绍 本项目实现了一个久坐提醒和喝水提醒的小助手,在检测到连续工作较长时间之后,会打印纸条, ...

  6. linux编写弹球游戏,手把手教你开发一款基于Box2D的弹球游戏(一)

    今天我们来介绍一款物理引擎,并基于它完成一个弹球游戏. 提到物理引擎,就是在游戏中模拟真实世界的运动,碰撞,摩擦等等.Cocos2d集成了两款常用的物理引擎:Box2D和Chipmunk,两款引擎都是 ...

  7. 手把手教你制作一款iOS越狱App,伪装微信位置

    说明 缘由 严重声明 概念 越狱的原理 iOS 目录层级结构 iOS 程序类型 准备工作 硬件设备 辅助软件 Mac 需要的工具 iOS 需要使用的辅助开发工具 逆向过程 静态分析 给App砸壳 使用 ...

  8. 手把手教你开发enc424j600+Lwip以太网-送全部源码

    每个单片机爱好者以及嵌入式软件开发人员,都希望能够将设计的产品连入网络,在众多的网络通讯方式中,以太网是最经典,跨度最广的一种方式,它具备带宽大[100Mbps~1000Mbps],延时小[局域网达到 ...

  9. 手把手教你定制一款专属的微信夸夸机器人

    手把手教你定制一款专属的微信夸夸机器人 最近你有没有被各种"夸夸群"刷屏? 彻底将"夸夸群"引爆的,是一个女生在微博上讲述的男友赠送三八节"神仙礼物& ...

最新文章

  1. AngularJS的稍复杂form验证
  2. 【新品发布】山海软件生产线pspl,包含了一个开源的混淆器
  3. 中国人民大学_《组织行为学》_11怎样招到最合适的人
  4. vba怎么安装_VBA还要学吗?怎么入门Excel VBA?
  5. 洛谷P1561 [USACO12JAN]爬山Mountain Climbing 贪心 数学
  6. python黑洞_史上第一张黑洞照片是用Python合成的?
  7. html 左边固定右边自动,七种实现左侧固定,右侧自适应两栏布局的方法
  8. CentOS Linux服务器实现攻防演练
  9. 【C语言】printf()函数详解
  10. 121. VLD 的使用
  11. 升级总代分享思路_定档了!升级了!1月23日《我家那闺女》第二季要给你“好看”...
  12. 西门子S7系列中间人攻击:防御和流量异常检测(三)
  13. 小程序定制开发和模板软件的区别和优势
  14. 0618----Shell(二)
  15. 通信电源常见故障与处理
  16. canvas画布的基本教程
  17. 偏差方差分解中为什么第三行第六行为零
  18. mac 谷歌浏览器 跨域访问
  19. 围成一圈的排列组合问题_排列组合问题模拟练习题
  20. 写贺卡给毕业师姐怎么写计算机系的,师哥送下一届毕业的寄语

热门文章

  1. SQLServer学习笔记(二):数据库的操作
  2. 解密上帝之手 - 阿里云HDB for PG特性(数据改命与任意列高效过滤)
  3. 单片机入门:80C51定时/计数器简介
  4. 2018虚幻引擎技术开放日完整议程曝光
  5. Open3D c++配置(VS2019)
  6. Html04-浮动与定位,盒子模型
  7. 键盘事件(只能输入数字的输入框,删除键可用)
  8. Socket简单学习之UDP通信
  9. 根据经纬度(lat,lng)查找附近的地点(续)
  10. 课程更新:通信原理——第六章