(NO.00005)iOS实现炸弹人游戏(十):游戏主角(三)

简介:

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)


下面我们来看游戏主角类里面几个播放特殊动画的方法,首先从runWinAnimation开始:

//运行精灵庆祝时的动画
-(void)runWinAnimation{
    CCActionJumpBy *jump = [CCActionJumpBy actionWithDuration:5
                                                     position:ccp(0, 5) height:5 jumps:10];
    [self runAction:[CCActionRepeatForever actionWithAction:jump]];
    [self runAnimation:_happyAnimation];
}

该动画在主角在游戏场景中找到并进入出口时播放,可以看到代码很简单,就是让主角跳跃同时运行_happyAnimation表示庆祝的动画.该动画在主角的初始化方法中预先创建过了.

当主角挂掉时,尤其是被火焰精灵碰到或者被炸弹炸到时,我们就播放fired动画:

//运行自燃动画
-(void)fired{
    if (_isDead) {
        return;
    }

    _isDead = YES;

    [self stopAllActions];
    CCActionAnimate *animate = [CCActionAnimate actionWithAnimation:_firedAnimation];
    CCActionDelay *delay = [CCActionDelay actionWithDuration:0.3];
    CCActionCallBlock *block = [CCActionCallBlock actionWithBlock:^{
        self.visible = NO;
    }];
    CCActionSequence *seq = [CCActionSequence actions:animate,delay,block,nil];
    [self runAction:seq];
}

如果主角已经挂了则直接返回,否则设置主角死亡状态,停止所有动作,按游戏逻辑调整动画运行的间隔和串行序列动作,最后运行该序列动作.

在主角类的接口文件中我们提到2个方法:

-(BOOL)isInvincible;
-(void)setIsInvincible:(BOOL)isInvincible;

大家可能回想把它们做成一个属性更好一点吧?但实际我们需要在写者方法中做附加操作,所以必须自己实现写者方法:

-(BOOL)isInvincible{
    return _isInvincible;
}

//因为要做额外的操作,所以没有用自动生成的属性
-(void)setIsInvincible:(BOOL)isInvincible{
    _isInvincible = isInvincible;
    [self setIsRiding:isInvincible];
}

大家可以看到我在写者方法中除了调整主角的_isInvincible变量,还调用了另外一个setIsRiding方法:

-(void)setIsRiding:(BOOL)isRiding{
    _isRiding = isRiding;

    CCSpriteFrame *spriteFrame;
    //如果当前是骑行状态则按前进方向将精灵帧设置为对应图片
    //ERROR:因为状态变为骑行状态时,精灵必定在移动过程中(移动中才能接触到无敌道具),所以只要判断当前的动画即可
    //加入拖拽道具,这里也要和下面一样判断2种情况
    if (isRiding) {
        if (_curAnimation == _facingForwardAnimation || _curDirection == RoleDirectionDown) {
            spriteFrame = [CCSpriteFrame frameWithImageNamed:@"bm_rideForward_2.png"];
        }else if (_curAnimation == _facingBackAnimation || _curDirection == RoleDirectionUp) {
            spriteFrame = [CCSpriteFrame frameWithImageNamed:@"bm_rideBack_2.png"];
        }else if (_curAnimation == _facingLeftAnimation || _curDirection == RoleDirectionLeft) {
            spriteFrame = [CCSpriteFrame frameWithImageNamed:@"bm_rideLeft_2.png"];
        }else if (_curAnimation == _facingRightAnimation || _curDirection == RoleDirectionRight) {
            spriteFrame = [CCSpriteFrame frameWithImageNamed:@"bm_rideRight_2.png"];
        }
    }else{
        //否则精灵处于非骑行状态,按前进方向恢复其精灵帧图片
        //不像上面一种情况,精灵恢复正常状态(非骑行状态)时需要判断两种情况:
        //1.精灵在移动中恢复状态 2.精灵处于静止状态时恢复状态
        //要分别判断这两种情况,做出处理.
        if (_curAnimation == _facingForwardRideAnimation || _curDirection == RoleDirectionDown) {
            spriteFrame = [CCSpriteFrame frameWithImageNamed:@"bm_forward_2.png"];
        }else if (_curAnimation == _facingBackRideAnimation || _curDirection == RoleDirectionUp) {
            spriteFrame = [CCSpriteFrame frameWithImageNamed:@"bm_back_2.png"];
        }else if (_curAnimation == _facingLeftRideAnimation || _curDirection == RoleDirectionLeft) {
            spriteFrame = [CCSpriteFrame frameWithImageNamed:@"bm_left_2.png"];
        }else if (_curAnimation == _facingRightRideAnimation || _curDirection == RoleDirectionRight) {
            spriteFrame = [CCSpriteFrame frameWithImageNamed:@"bm_right_2.png"];
        }else{

        }
    }
    //停止当前的动画
    [self stopAction:_curAnimate];
    //设置合适的精灵帧
    self.spriteFrame = spriteFrame;
}

上面注释说的足够清楚了,该方法的作用在于当主角处于无敌状态时,改变其移动的动画,让它骑在一头坐骑上,有点小霸气的赶脚啊 ;)

以下是当主角无敌时的效果示意图:

这里写图片描述

游戏主角到这里基本介绍完了,后面我们来看看游戏中的各种怪物吧 see you ;)

相关文章
|
安全 数据安全/隐私保护 iOS开发
iOS小技能:【发红包】使用tweak和lua脚本结合进行实现
我们开发的大部分越狱程序,都是编译成动态链接库(`例如:介绍的越狱程序(Tweak)开发,就是动态链接库。`),然后通过越狱平台的MobileSubstrate(iOS7上叫CydiaSubstrate)来加载进入目标程序(Target),通过对目标程序的挂钩(Hook),来实现相应的功能。
347 0
|
Android开发 iOS开发
iOS开发 - 商品详情页两种分页模式,只提供思路和实现方式。
iOS开发 - 商品详情页两种分页模式,只提供思路和实现方式。
419 0
iOS开发 - 商品详情页两种分页模式,只提供思路和实现方式。
|
存储 安全 iOS开发
iOS开发 - 继udid,Mac地址等一系列唯一标识无效后,如何用KeyChain来实现设备唯一性
iOS开发 - 继udid,Mac地址等一系列唯一标识无效后,如何用KeyChain来实现设备唯一性
479 0
iOS开发 - 继udid,Mac地址等一系列唯一标识无效后,如何用KeyChain来实现设备唯一性
|
Swift 数据安全/隐私保护 iOS开发
iOS开发 - swift通过Alamofire实现https通信
iOS开发 - swift通过Alamofire实现https通信
443 0
iOS开发 - swift通过Alamofire实现https通信
|
开发者 iOS开发
iOS开发 - 用AFNetworking实现https单向验证,双向验证
iOS开发 - 用AFNetworking实现https单向验证,双向验证
436 0
iOS开发 - 用AFNetworking实现https单向验证,双向验证
|
iOS开发
iOS小技能:自动布局实现兄弟控件N等分且宽高比例是1:N(xib 上实现)
本文为 iOS视图约束专题的第三篇:xib上使用自动布局教程
183 0
|
Linux iOS开发 开发者
实现在windows、linux下上传ios app到App Store
实现在windows、linux下上传ios app到App Store
实现在windows、linux下上传ios app到App Store
|
小程序 前端开发 Shell
接入 mPaaS 小程序并实现启动 iOS 版| 学习笔记
快速学习接入 mPaaS 小程序并实现启动 iOS 版。
接入 mPaaS 小程序并实现启动 iOS 版| 学习笔记
|
小程序 Shell 开发工具
接入 mpaas 小程序并实现启动 IOS 版|学习笔记
快速学习接入 mpaas 小程序并实现启动 IOS 版
237 0
接入 mpaas 小程序并实现启动 IOS 版|学习笔记
|
程序员 API Android开发
iOS开发:简单的Toast提示框实现
博主是以iOS开发出身,那就最后一篇博文就分享一下关于iOS的内容吧。iOS开发过程中,有些时候操作App的时候,需要给用户对应的响应提示操作,使用系统自带的提示框不是每种情况都适用的。
733 0
iOS开发:简单的Toast提示框实现