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

103 篇文章 0 订阅
53 篇文章 0 订阅

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

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

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

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

我们通过[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这个类,还可以在startScenegameScene之间添加一个LoadingScene,由于篇幅限制,就不在这里多说了,关于代码优化的地方也不一一列举了,有经验的读者可以在这个基础上进行一些必要的重构,包括可以将背景层抽象出来作为单独的类,这样在startLayer中的背景也可以复用这些代码,对于GameLayer中的一些代码也可以做进一步的优化,对于较长的函数可以分解等等,总之代码还有很多不完善的地方,欢迎留言批评指正。另外在开发的过程中,可以使用xcode自带的instruments工具进行内存分析等等。

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

 

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值