注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

风的驿站

一徐清风,半指烛光,觥筹已净,只余茶香。残卷一章,妙趣非常,忽闻帘响,愿闻其详?

 
 
 

日志

 
 
关于我

喜欢写生 编程 音乐 设计 喜欢把自己的想法变成实实在在的东西 喜欢安静的做一些事情 CSDN博客:http://blog.csdn.net/qwertyupoiuytr

网易考拉推荐

【原创】手把手教你开发一款IOS飞行射击游戏(完)  

2014-05-14 22:42:14|  分类: Cocos2d |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

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

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

类似于GameSceneGameLayer的关系,我们同样不直接定义StartSceneGameOverScene,而是定义StartLayerGameOverLayer,然后添加静态方法返回包含LayerCCScene

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

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

 

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

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

- (void) onEnterTransitionDidFinish

{

[[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:self priority:1 swallowsTouches:YES];

}

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

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

- (void) onExit

{

[[[CCDirector sharedDirector] touchDispatcher] removeDelegate:self];

}

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

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

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

    //CGPoint location = [[CCDirector sharedDirector] convertToGL:[touch locationInView:[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方法中做一下判断,如果用户的touch location在三个难度选项对应的CCSprite对象范围内,则切换难度而不开始游戏,如果用户的touch location在难度选项对应的CCSprite对象范围外,则切换场景开始游戏。同样,我们应该将“难度”作为参数传递给GameLayer,并且GameLayer在初始化的时候应该根据传入的难度参数设置不同的游戏参数。

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

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

 

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

还是那句话,发帖不易,转载请注明出处手把手教你开发一款IOS飞行射击游戏(完) - Daniel - KHome

  评论这张
 
阅读(253)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017