接上一篇博文,我们继续完成射击的功能.

还是在MainScene.m中,添加initBullets方法:

-(void)initBullets{
    CCSprite *bullet;
    for (int i = 0; i < MAX_BULLET_COUNT; i++) {
        bullet = (CCSprite*)[CCBReader load:@"Sprites/Bullet"];
        bullet.positionType = CCPositionTypeNormalized;
        bullet.visible = NO;
        [_bullets addObject:bullet];
        [_physics addChild:bullet];
    }
}

该方法用来预先缓存子弹,其中MAX_BULLET_COUNT值为10,即表示我们预先创建10颗子弹,这10颗子弹是可以重复使用的,造成子弹无穷的假象.下面看一下如何”制造”一颗子弹:

首先加载Bullet.ccb文件到bullet变量中,不要问为什么代码中没有.ccb后缀,前面SpriteBuilder普及知识里已经说过了,大家可以搜一下.然后修改子弹位置类型,这时子弹是看不见的,因为我们还没有发射出去.将子弹分别添加到子弹数组和物理对象中.

这里要注意的是,不能直接把子弹添加到MainScene场景中,因为子弹是物理对象,他只能添加到物理世界中.

修改didLoadFromCCB方法,在最后添加如下代码:

    [self initBullets];

子弹的初始化工作都完成了,但是这时子弹还是不能用,还需要一个子弹”上膛”操作,子弹上膛之后才可以真正发射,遂添加一个loadBullet方法:

-(CCSprite*)loadBullet{
    static NSInteger last = 0;
    for (CCSprite* bullet in _bullets) {
        if (!bullet.visible) {
            bullet.visible = YES;
            return bullet;
        }
    }
    //如果所有子弹都可见,则取可见时间最长的那一颗
    CCSprite *bullet = _bullets[last];
    last = (last + 1)%MAX_BULLET_COUNT;
    return bullet;
}

前面说过了,默认弹夹里的子弹都是不可见的,一旦发射出去子弹就变得可见了.这里寻找第一个不可见的子弹,然后上膛,将其变得可见,准备击发.如果此时所有子弹都可见怎么办?这意味着所有弹夹内的子弹都被打出去了.我们必须回收利用已经打出去的子弹,我们选择最早打出去的的那一颗子弹,注意方法中last变量是静态的.

(NO.00002)iOS游戏精灵战争雏形(七)的更多相关文章

  1. (NO.00002)iOS游戏精灵战争雏形(一)

    原本想做一个复杂点的平面动作游戏,可以觉得还是有点把握不了.还是先从简单的原型开始吧. 构思中的精灵战争(SpriteWar)是一个类似FC时代的小游戏,可以造兵,可以捕获敌兵.原本还想加上保卫老巢的 ...

  2. (NO.00002)iOS游戏精灵战争雏形(十二)

    首先要声明的是,前几篇实现的shoot方法不是一定会命中目标,这取决于目标运行的速度,子弹的速度,子弹发射的时机以及弹道路径中是否有障碍物等等. 这也是符合实际情况的.如果你的要求是一旦发出子弹必定击 ...

  3. (NO.00002)iOS游戏精灵战争雏形(二)

    在SpriteBuilder中新建Images文件夹,将所需要的图片素材全部拖入其中: 别忘了将其转换为智能精灵图表文件夹. 因为我们不需要为ipad和安卓设计,所以在项目设置里将所有出iphone以 ...

  4. (NO.00002)iOS游戏精灵战争雏形(十一)

    为了在子弹触碰到目标时做一些事情,我们必须要设置碰撞回调. 首先在MainScene.h的类接口中添加碰撞协议: @interface MainScene : CCNode <CCPhysics ...

  5. (NO.00002)iOS游戏精灵战争雏形(八)

    子弹的初始化工作前2篇基本做好了,下面就是如何射出子弹. 通常来说,子弹射向目标对象,需要走一条直线.直线由2点定位,分别为发射点和目标点. 发射点就是开枪精灵自身的位置,目标点则为敌方精灵的位置,大 ...

  6. (NO.00002)iOS游戏精灵战争雏形(六)

    接下来我们给MainScene场景再添加一个精灵,作为敌人. 双击SpriteBuilder中的MainScene.ccb,从控件库拖入一个CCSprite到CCPhysicsNode中,设置精灵帧为 ...

  7. (NO.00002)iOS游戏精灵战争雏形(五)

    完成了精灵自己移动之后,我们开始着手实现按住精灵拖动的功能. 要想处理触摸事件,我们需要做2件事: 1.在类的初始化中打开触摸接收属性 2.实现触摸处理回调方法 我们依次来做这2件事. 首先要搞清楚在 ...

  8. (NO.00002)iOS游戏精灵战争雏形(四)

    在Xcode打开MainScene,添加初始化代码如下: -(void)didLoadFromCCB{ NSAssert(_sprite1, @"_sprite1 must not nil& ...

  9. (NO.00002)iOS游戏精灵战争雏形(三)

    在Sprite中新建Sprites文件夹,在其中添加Player.cc文件,确保其类型为Sprite. 将其Root节点的CCSprite的精灵帧设置为Image/sprite-2.png,然后打开物 ...

随机推荐

  1. textarea不能使用maxlength

    知道文本框有个maxlength属性,有次开发项目中使用了textarea标签,没去看文档,直接加了maxlength属性,且有效果没有报错,喜滋滋的用了,结果没两天就测试出了bug 问题描述:文本域 ...

  2. python学习之路网络编程篇(第五篇)-续篇

    Python堡垒机实现之基础知识 一般的堡垒机必须要具备以下5个基本功能: 1.权限控制 2.执行命令 3.上传下载文件 4.远程登录 5.记录操作 权限控制 说明:根据不同的登录用户分配不同的可管理 ...

  3. ACM 数塔

    在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?  已经告诉你了,这是个DP的题 ...

  4. PHP 5 Date/Time 函数

    PHP Date/Time 简介 Date/Time 函数允许您从 PHP 脚本运行的服务器上获取日期和时间.您可以使用 Date/Time 函数通过不同的方式来格式化日期和时间. 注释:这些函数依赖 ...

  5. Docker 容器格式

    最初,Docker 采用了 LXC 中的容器格式.自 1.20 版本开始,Docker 也开始支持新的 libcontainer 格式,并作为默认选项. 对更多容器格式的支持,还在进一步的发展中.

  6. Python3 File 方法

    Python3 File(文件) 方法 file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数: 序号 方法及描述 1 file.close() 关闭文件.关闭后文件不能再进行 ...

  7. day08 JSP

    day08 JSP 1. jsp 入门和 jsp 运行原理 2. jsp 语法 2.1 jsp 模板元素:jsp 页面中的 html 内容.它定义了网络基本骨架,即定义了页面结构和外观. 2.2 js ...

  8. Android Multimedia框架总结(二十四)MediaMuxer实现手机屏幕录制成gif图

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53866405 前言:上篇中,介绍 ...

  9. 安卓高级9 shareSDK 第三方登陆和分享Mob

    ShareSDK推荐此官网地址 官网注册和申请key流程 注册 略 进入后台创建应用得到可以 下载SDK 解压下载的压缩包 第三方平台申请key 如果你想申请QQ登陆或者分享需要去腾讯开发者申请,申请 ...

  10. JAVA面向对象-----java面向对象的六大原则

    现在编程的主流语言基本上都是面向对象的.如C#,C++,JAVA.我们在使用时,已经构造了一个个的类.但是往往由于我们在类内部或外部的设计上存在种 种问题,导致尽管是面向对象的语言,却是面向过程的逻辑 ...