大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.

如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)


上一篇我们完成了导弹道具相关的道具制作,本篇中我们来完成其实现代码

首先我们在Star.m的spawnStar方法中添加如下代码:

case brkColorPoolBlue:
            star = [Star starWithType:starTypeStickShoot];
            break;

接着打开GameScene.m文件,在星星和反弹棒的碰撞处理方法中添加如下处理分支:

case starTypeStickShoot:
            @synchronized(self){
                [Star doStickShootWork];
            }
            break;

现在重新回到Star.m中,添加doStickShootWork方法:

+(void)doStickShootWork{
    GameScene *gameScene = [GameScene sharedGameScene];
    if (gameScene.isStickShooting) {
        return;
    }

    gameScene.isStickShooting = YES;
    [gameScene scheduleBlock:^(CCTimer *timer){
        @synchronized(gameScene){
            gameScene.isStickShooting = NO;
        }
    } delay:10];
}

该方法很简单,首先如果反弹棒已处在射击状态则直接返回.否则将反弹棒设置为射击状态,然后在10秒后取消射击状态.

再次回到GameScene.m中,添加设置射击状态的方法:

-(void)setIsStickShooting:(BOOL)isStickShooting{
    _isStickShooting = isStickShooting;
    if (_gunTop) {
        _gunTop.visible = _isStickShooting;
    }
}

在初始化方法的最下面中添加如下一行:

    [self schedule:@selector(autoShoot) interval:1];

游戏逻辑每隔1秒钟调用一次autoShoot方法来实现自动射击,那么该方法做了什么事呢?我们来看一下:

-(void)autoShoot{
    @synchronized(self){
        if (self.isStickShooting && _gunTop && _gunTop.visible) {
            [Star shoot:_gunTop.position];
        }
    }
}

貌似很简单,方法首先判断当前反弹棒是否处在射击状态,并且设计炮管已初始化且可见.如果这些条件都满足则调用Star类中的shoot方法,并向方法传递了当前炮管位置的坐标.

导弹是可以摧毁砖块的,所以还要实现一个碰撞处理方法:

-(BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair bullet:(CCNode *)bullet
                         brick:(CCNode *)brick{
    @synchronized(self){
        CCSprite *bulletSp = (CCSprite*)bullet;
        [bullet removeFromParent];

        [_userInterface updateHitsLabel:[NSString stringWithFormat:@"Hits:%d",++_hits]];

        _score += ((Brick*)brick).value * _scoreRatio;
        if (_scoreRatio > 1) {
            [self updateMsgLabel:[NSString stringWithFormat:@"Score X %d",_scoreRatio]];
        }

        [_userInterface updateScoreLabel:[NSString stringWithFormat:@"得分:%d",_score]];

        [Star spawnStar:(Brick*)brick];
        [brick removeFromParent];
        [_level removeFromBricks:brick];
    }
    return YES;
}

代码很简单,大家可以自行理解.

最后我们就来实现Star的+shoot方法:

+(void)shoot:(CGPoint)startPos{
    GameScene *gameScene = [GameScene sharedGameScene];
    CCPhysicsNode *physWorld = gameScene.physicsWorld;

    @synchronized(gameScene){
        CGSize viewSize = [CCDirector sharedDirector].viewSize;
        CCSprite *bullet = (CCSprite*)[CCBReader load:@"Elements/Bullet"];
        bullet.position = startPos;
        [physWorld addChild:bullet];
        CCActionMoveTo *move = [CCActionMoveTo actionWithDuration:2 position:ccp(bullet.position.x,
                                                                                 viewSize.height)];
        CCActionCallBlock *blk = [CCActionCallBlock actionWithBlock:^{
            [bullet removeFromParent];
        }];
        CCActionSequence *seq = [CCActionSequence actions:move,blk,nil];
        [bullet runAction:seq];
    }
}

方法主要逻辑如下:

  • 取得游戏场景对象中的物理世界对象
  • 初始化导弹动画精灵对象
  • 在导弹对象上运行向前飞行的动作,直到屏幕最上端
  • 在到达屏幕最上端后,将导弹对象删除

编译运行游戏,可以看到效果如下:

当然球掉落之后,应该游戏结束了,导弹不用再发射了,在实际游戏中这是一个需要修改的地方.

好了,我们在本系列打砖块游戏中实现了不少东西,其实限于时间原因很多地方都没有扩展和完善.毕竟一个真实的游戏想要吸引玩家的眼球和手指还有很多部分需要修改.

但让我们暂时在这里打住,向下一个游戏目标前进吧.

下一系列<<愤怒的炸弹>>的博文中再见吧 ;)

(本系列完)

(NO.00004)iOS实现打砖块游戏(十六):导弹发射道具的实现(下)的更多相关文章

  1. (NO.00004)iOS实现打砖块游戏(十五):导弹发射道具的实现(上)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 上一篇中我们实现了3球道具,但是好像还是不过瘾,如果能让反弹棒更 ...

  2. (NO.00004)iOS实现打砖块游戏(十四):3球道具的实现

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 反弹棒变化道具实现前面已经介绍过了,我们下面可以在小球上做些文章 ...

  3. (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 通用的星星类已经完成了,下面我们来实现具体的变长和缩短道具. 变 ...

  4. (NO.00004)iOS实现打砖块游戏(十):砖块!更多的砖块!

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 到目前为止游戏基本可玩,但是砖块数量是不变的,等玩家打光所有的砖 ...

  5. (NO.00004)iOS实现打砖块游戏(六):反弹棒类

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 打砖块游戏另一个要素是反弹棒,我们在这篇类来实现反弹棒类. 创建 ...

  6. 从零开始学ios开发(十六):Navigation Controllers and Table Views(下)

    终于进行到下了,这是关于Navigation Controllers和Table Views的最后一个例子,稍微复杂了一点,但也仅仅是复杂而已,难度不大,我们开始吧. 如果没有上一篇的代码,可以从这里 ...

  7. (NO.00004)iOS实现打砖块游戏(一):素材的制作

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 本系列来实现一个儿时就很喜欢的打砖块游戏,我记得以前红白机上有一 ...

  8. (NO.00004)iOS实现打砖块游戏(十三):伸缩自如,我是如意金箍棒(下)!

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 准备缩短反弹棒素材 和上一篇类似,我们如法炮制一张缩短后反弹棒的 ...

  9. (NO.00004)iOS实现打砖块游戏(十一):"一闪一闪亮晶晶,我们都是小星星"

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 现在一个基本的游戏逻辑已经搭建好了,但是感觉还是缺点什么呢? 蠢 ...

随机推荐

  1. 【Python系列】HDF5文件介绍

    一个HDF5文件是一种存放两类对象的容器:dataset和group. Dataset是类似于数组的数据集,而group是类似文件夹一样的容器,存放dataset和其他group.在使用h5py的时候 ...

  2. ubuntu上的附件-终端和用快捷键ctrl+alt+f1 有啥区别

    ctrl +alt +Fn 打开的是模拟终端,简单说来,linux系统一开机会自动打开6个模拟终端,然后自动切换到其中一个(一般来说是切换到图形界面的那个也就是说窗口管理器是在这6个模拟终端中运行的) ...

  3. C语言程序设计第五次作业——循环结构(1)

    一.改错题 1.题目 输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下:c = 5×( ...

  4. windows server 2008 R2 NPS(网络连接策略服务)设置radius,实现telent登陆交换机路由器权限分配

    windows2008NPS(网络连接策略)设置radius 实现telent登陆交换机路由器权限分配 转载请说明出处 一,安装 首先在08中添加服务器角色网络策略和访问服务(Network Poli ...

  5. CNN中的经典结构之AlexNet

    AlexNet的基本结构 Alexnet是由5个卷积层和三个全连接层组成,一共8个权重层(池化层不是权重层因为其没有参数),其中ReLU激活函数作用在每个卷积层和全连接层上,在第一个卷积层和第二个卷积 ...

  6. vue之生命周期

    vue的生命周期的过程提供了我们执行自定义逻辑的机会,好好理解它的生命周期,对我们很有帮助. 1.vue实例的生命周期(vue2.0) 2.生命周期描述:(参考截图) 3.例子 window.vm = ...

  7. JMeter如何和Charles进行接口测试

    什么是接口测试,接口测试到底如何开展,我相信任何一个软件测试人员都会有这样的疑问, 这里我以接口测试自动化平台的登录接口进行讲解. 一.什么是接口测试? 接口测试是测试系统组件间接口的一种测试.接口测 ...

  8. ERP中的地区管理

    地区管理 地区管理主要实现地区数据的添加.编辑.查看.启用.禁用等功能,另外还包含地区选择控件封装. 业务功能点: 地区数据查看:地区列表树状展现,列表增加省.市.区.县.乡图标. 地区选择控件:选择 ...

  9. 日历类和日期类转换 并发修改异常 泛型的好处 *各种排序 成员和局部变量 接口和抽象类 多态 new对象内存中的变化

    day07 ==和equals的区别? ==用于比较两个数值 或者地址值是否相同.  equals 用于比较两个对象的内容是否相同   String,StringBuffer.StringBuilde ...

  10. dict 字典的用法

    因为这一章节用的比较多,而需要注意的得比较多, 所以总结的笔记也相对比较多一点,我就直接单独写了一页 ##    {key:value} 1. key不能为列表 2.value可以是任意类型值 3.返 ...