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

来源:互联网 时间:1970-01-01

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

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

[code]-(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方法,在最后添加如下代码:

[code] [self initBullets];


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

[code]-(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变量是静态的.



相关阅读:
Top