现在按住手臂可以非常自然和舒服的旋转了,丝般顺滑:移动停止,旋转立即停止,没有什么惯性影响了.
以上一共介绍了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中的工作都完成了,下面我们看看如何让机器人发射子弹,下篇见 ;)