现在按住手臂可以非常自然和舒服的旋转了,丝般顺滑:移动停止,旋转立即停止,没有什么惯性影响了.
以上一共介绍了2中旋转方式,到底采用哪种方式呢?其实看实际游戏的需求和个人的喜好了.本猫在Level中添加了2个机器人,每种类型一个,想用哪个都可以.
机器人手臂旋转基本完成,下面是发射子弹的干活了.
回到SpriteBuilder中,在Sprites文件夹中新建Bullet.ccb文件,类型为Sprite. 添加以前绘制的素材,打开其物理对象,类似如下图:
你可以把子弹物理边界设置的严丝合缝很精细,也可以如上图一样简单圈出一个圈大概意思一下,一切随你.
回到Xcode中,打开MainScene.m文件添加一个实例变量:
NSMutableArray *_bullets;
在场景对象init方法中初始化数组:
-(instancetype)init{ self = [super init]; if (self) { _bullets = [NSMutableArray array]; } return self; }
接着新建2个与子弹初始化相关的方法loadBullet和initBullets方法,代码不再贴出,和NO.00002基本类似.
initBullets方法功能为预先缓存子弹,loadBullet则在弹仓中取出一颗可用的子弹用来射击.
说到射击,自然要写一个shoot:to:方法:
-(void)shoot:(CGPoint)from to:(CGPoint)to{ //如果游戏暂停则返回 if (_isPaused) { return; } //如果子弹用光则返回 if (_bulletRestrict == 0) { return; } CGPoint velocity = ccpSub(to, from); velocity = ccpMult(velocity, 5); CCNode *bullet = [self loadBullet]; NSAssert(bullet, @"bullet must not nil"); bullet.position = to; CCPhysicsBody *phyBullet = bullet.physicsBody; //将之前用过的子弹力矩清空,否则力矩貌似会累加,这会造成弹道偏离. phyBullet.velocity = ccp(0, 0); //重新为子弹应用力矩 [phyBullet applyAngularImpulse:10]; [phyBullet applyImpulse:velocity]; //子弹限制为-1表示无限制,否则递减子弹数目,同时更新UI中剩余弹量的显示. if (_bulletRestrict != -1) { _bulletRestrict--; _bulletLabel.string = [NSString stringWithFormat:@"Bullet:%d",_bulletRestrict]; } }
方法内容比较清楚了,注释应该可以说明问题了. MainScene中的工作都完成了,下面我们看看如何让机器人发射子弹,下篇见 ;)