打开MainScene.m,添加shoot方法:
//子弹速度现在和目标距离相关,越近速度越慢,反之越快.应该修改为恒定速度.
-(void)shoot:(CCNode*)player target:(CGPoint)point{
CGPoint velocity = ccpSub(point, player.position);
velocity = ccpMult(velocity, 50);
if (ABS(velocity.x) < 20 || ABS(velocity.y) < 20) {
velocity = ccpMult(velocity, 5);
}
if (ABS(velocity.x) > 200 || ABS(velocity.y) > 200){
velocity = ccpMult(velocity, 0.5);
}
CCNode *bullet = [self loadBullet];
NSAssert(bullet, @"bullet must not nil");
bullet.position = player.position;
CCPhysicsBody *physicsBody = bullet.physicsBody;
[physicsBody applyAngularImpulse:10];
[physicsBody applyImpulse:velocity];
}
我们详细说说这个方法.首先该参数传入2个参数,分别对应发射点和目标点.计算可知子弹力矩为velocity.因为默认力矩太小,力太微弱,我们需要适当放大该力矩.具体应该放大多少应该根据实际App运行效果来定,我这里觉得50倍比较合适.
在实际子弹发射过程中,可能会出现由于力矩的某条边角度过小或过大导致子弹速度过快或过慢得现象.我们需要根据实际角度调整力矩的值.我承认这只是权宜之计,如果时间允许这段判断代码需要进一步修改.
然后是上膛子弹到bullet中,这里做了断言以防没有子弹,正常情况下这应该是不可能发生的.
注意loadBullet方法已经将返回的子弹设置为可见了.接下来我们设置子弹的初始位置,取得子弹的物理对象,然后应用指定的力矩.
而应用力矩方法上面还调用了另一个方法applyAngularImpulse,这个方法用来使发出的子弹旋转,增加视觉效果.
时间: 2024-10-05 16:20:26