(NO.00002)iOS游戏精灵战争雏形(七)
接上一篇博文,我们继续完成射击的功能.
还是在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游戏精灵战争雏形(七)的更多相关文章
- (NO.00002)iOS游戏精灵战争雏形(一)
原本想做一个复杂点的平面动作游戏,可以觉得还是有点把握不了.还是先从简单的原型开始吧. 构思中的精灵战争(SpriteWar)是一个类似FC时代的小游戏,可以造兵,可以捕获敌兵.原本还想加上保卫老巢的 ...
- (NO.00002)iOS游戏精灵战争雏形(十二)
首先要声明的是,前几篇实现的shoot方法不是一定会命中目标,这取决于目标运行的速度,子弹的速度,子弹发射的时机以及弹道路径中是否有障碍物等等. 这也是符合实际情况的.如果你的要求是一旦发出子弹必定击 ...
- (NO.00002)iOS游戏精灵战争雏形(二)
在SpriteBuilder中新建Images文件夹,将所需要的图片素材全部拖入其中: 别忘了将其转换为智能精灵图表文件夹. 因为我们不需要为ipad和安卓设计,所以在项目设置里将所有出iphone以 ...
- (NO.00002)iOS游戏精灵战争雏形(十一)
为了在子弹触碰到目标时做一些事情,我们必须要设置碰撞回调. 首先在MainScene.h的类接口中添加碰撞协议: @interface MainScene : CCNode <CCPhysics ...
- (NO.00002)iOS游戏精灵战争雏形(八)
子弹的初始化工作前2篇基本做好了,下面就是如何射出子弹. 通常来说,子弹射向目标对象,需要走一条直线.直线由2点定位,分别为发射点和目标点. 发射点就是开枪精灵自身的位置,目标点则为敌方精灵的位置,大 ...
- (NO.00002)iOS游戏精灵战争雏形(六)
接下来我们给MainScene场景再添加一个精灵,作为敌人. 双击SpriteBuilder中的MainScene.ccb,从控件库拖入一个CCSprite到CCPhysicsNode中,设置精灵帧为 ...
- (NO.00002)iOS游戏精灵战争雏形(五)
完成了精灵自己移动之后,我们开始着手实现按住精灵拖动的功能. 要想处理触摸事件,我们需要做2件事: 1.在类的初始化中打开触摸接收属性 2.实现触摸处理回调方法 我们依次来做这2件事. 首先要搞清楚在 ...
- (NO.00002)iOS游戏精灵战争雏形(四)
在Xcode打开MainScene,添加初始化代码如下: -(void)didLoadFromCCB{ NSAssert(_sprite1, @"_sprite1 must not nil& ...
- (NO.00002)iOS游戏精灵战争雏形(三)
在Sprite中新建Sprites文件夹,在其中添加Player.cc文件,确保其类型为Sprite. 将其Root节点的CCSprite的精灵帧设置为Image/sprite-2.png,然后打开物 ...
随机推荐
- Laravel-admin 使用Layer相册功能
使用Laravel-admin后台,Laravel-admin已经集成了很多前端组件,但是在手册中也没有发现能够展示相册的插件,而本人比较喜欢Layer弹窗的插件所以想使用Layer来进行效果展示 通 ...
- Node.js ZLIB
Zlib 稳定性: 3 - 文档 可以通过以下方式访问这个模块: var zlib = require('zlib'); 这个模块提供了对 Gzip/Gunzip, Deflate/Inflate, ...
- DB2 911错误的解释
SQL0911N 因为死锁或超时,所以当前事务已回滚.原因码为 "<原因码>". 说明: 当前工作单元参与了未解决的对象争用,因此必须回滚. 原因码如下所示: 2 ...
- Python 好用得让人发指的函数参数语法糖
是吗? def f(x,y,z): return x+y+z t=(200,300) print(f(1,2,3)) print(f(1,*t)) 结果: >>> 6 501 这是我 ...
- Hibernate之实体关系映射
延迟加载与即时加载 例如Person类和Email类是一对多关系,如果设为即时加载,当加载Person时,会自动加载Email,如果设置为延迟加载,当第一次调用person.getEmails()时才 ...
- NSDictionary writeToFile:atomically: 时失败
一.现象:如下图,当NSDictionary调用 writeToFile:atomically: 时,如果容器里面包含的对象(即通过 objectForKey: 拿到的对象),为非property l ...
- CRM 2013 Script Loading Deep Dive
关于CRM中脚本的加载次序梳理的很不错,可以看看 https://community.dynamics.com/crm/b/develop1/archive/2013/11/02/crm-2013-s ...
- ERROR: In <declare-styleable> MenuView, unable to find attribute android:preserveIconSpacing
eclipse sdk从低版本切换到高版本sdk的时候 v7包会包这个错ERROR: In <declare-styleable> MenuView, unable to find ...
- Android的log日志知识点剖析
log类的继承结构 Log public final class Log extends Object java.lang.Object ↳ android.util.Log log日志的常用方法 分 ...
- Android 在 SElinux下 如何获得对一个内核节点的访问权限
点击打开链接 Android 5.0下,因为采取了SEAndroid/SElinux的安全机制,即使拥有root权限,或者对某内核节点设置为777的权限,仍然无法在JNI层访问. 本文将以用户自定义的 ...