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

有了前面的基础,相信现在你对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. 个推数据统计产品(个数)iOS集成实践
  2. Linux 常用命令之系统信息
  3. vue之登录和token处理
  4. HTML/CSS——PC端博文尚美网页
  5. boost::lambda::switch_statement用法的测试程序
  6. jetbrains从入门到卸载 (前言) 为什么要jetbrains
  7. BZOJ #3625 CF #438E 小朋友和二叉树
  8. Struts2的工作原理及工作流程
  9. 单元测试框架之Robolectric踩坑
  10. 【项目实践】:KNN实现手写数字识别(附Python详细代码及注释)
  11. openssl生成证书
  12. 移动端点击出现阴影 css解决方案
  13. python多级菜单_python练习题:多级菜单(dict练习)
  14. Relief 特征选择算法简单介绍
  15. Windows32下安装Ruby 2.7.2【记录安装过程】
  16. 数理统计-5.3 统计量及其分布
  17. win7开机突然变得很慢_Win7电脑反应变慢怎么办?
  18. android自定义通知栏样式,Android 通知栏自定义样式
  19. 手机电视机屏幕分辨率
  20. Python趣味案例 - 抓扑克牌的手气

热门文章

  1. 如何让外网访问你的电脑
  2. QNX neutrino 实时操作系统的原理
  3. 在VScode中创建Java项目
  4. C# ---XML与Excel相互转换(DataTable)
  5. DBCP连接池耗尽问题
  6. Google网站管理员工具地址
  7. Idea 实用功能简介
  8. java锁屏_Java防锁屏小程序代码实例
  9. 自己动手制作更好用的markdown编辑器-01
  10. 北京络捷斯特第三方物流信息系统技术解析(二) 订单录入-入库订单