2012-01-11 58 views
0

我有一个大炮,一个球和一个触发器。当你按下触发器时,线性脉冲被施加到球上。线性脉冲 - Cocos2d/Objective-C/Box2d

short int direction = [level.cannon cannon].rotation; 

short int power = 24.8; 
b2Vec2 force = b2Vec2(direction, power); 
[level.ball body]->ApplyLinearImpulse(force, [level.ball body]->GetWorldCenter()); 

我的问题是,当按下扳机时,线性脉冲被施加到球,但球并没有真正走出来的精灵炮的顶部。

它这样做的原因(我认为)是因为我已经将大炮的锚点设置为(0.5,0)。

cannon.anchorPoint = ccp(0.5, 0); 

我已经知道大炮每旋转5度旋转一次,旋转就需要增加/减少2的倍数。

E.G.

对于0至55度

0-5减去2从旋转 5至10减去4从旋转从旋转 等

对于0 10〜15减6 - 55度

0至-5添加2到旋转 -5至-10添加4到旋转 -10--15添加6到旋转

目前,我正在使用此代码来完成此操作。

if (_cannon.rotation == 0) 
    { 
     direction = _cannon.rotation; 
    } else if (_cannon.rotation >= 1 && _cannon.rotation < 6) 
    { 
     direction = _cannon.rotation - 2; 
    } else if (_cannon.rotation >= 6 && _cannon.rotation < 11) 
    { 
     direction = _cannon.rotation - 4; 
    } else if (_cannon.rotation >= 11 && _cannon.rotation < 16) 
    { 
     direction = _cannon.rotation - 6; 
    } else if (_cannon.rotation >= 16 && _cannon.rotation < 21) 
    { 
     direction = _cannon.rotation - 8; 
    } else if (_cannon.rotation >= 21 && _cannon.rotation < 26) 
    { 
     direction = _cannon.rotation - 10; 
    } else if (_cannon.rotation >= 26 && _cannon.rotation < 31) 
    { 
     direction = _cannon.rotation - 12; 
    } else if (_cannon.rotation >= 31 && _cannon.rotation < 36) 
    { 
     direction = _cannon.rotation - 14; 
    } else if (_cannon.rotation >= 36 && _cannon.rotation < 41) 
    { 
     direction = _cannon.rotation - 16; 
    } else if (_cannon.rotation >= 41 && _cannon.rotation < 46) 
    { 
     direction = _cannon.rotation - 18; 
    } else if (_cannon.rotation >= 46 && _cannon.rotation < 55) 
    { 
     direction = _cannon.rotation - 20; 
    } else if (_cannon.rotation <= -1 && _cannon.rotation > -6) 
    { 
     direction = _cannon.rotation + 2; 
    } else if (_cannon.rotation <= -6 && _cannon.rotation > -11) 
    { 
     direction = _cannon.rotation + 4; 
    } else if (_cannon.rotation <= -11 && _cannon.rotation > -16) 
    { 
     direction = _cannon.rotation + 6; 
    } else if (_cannon.rotation <= -16 && _cannon.rotation > -21) 
    { 
     direction = _cannon.rotation + 8; 
    } else if (_cannon.rotation <= -21 && _cannon.rotation > -26) 
    { 
     direction = _cannon.rotation + 10; 
    } else if (_cannon.rotation <= -26 && _cannon.rotation > -31) 
    { 
     direction = _cannon.rotation + 12; 
    } else if (_cannon.rotation <= -31 && _cannon.rotation > -36) 
    { 
     direction = _cannon.rotation + 14; 
    } else if (_cannon.rotation <= -36 && _cannon.rotation > -41) 
    { 
     direction = _cannon.rotation + 16; 
    } else if (_cannon.rotation <= -41 && _cannon.rotation > -46) 
    { 
     direction = _cannon.rotation + 18; 
    } else if (_cannon.rotation <= -46 && _cannon.rotation > -55) 
    { 
     direction = _cannon.rotation + 20; 
    } 

我知道必须有一个更简单的方法来做到这一点,但我仍然在学习。有人可以帮帮我吗?

回答

0
short int val, val2; 
val = _cannon.rotation/5; 
val2 = _cannon.rotation%5; //remainder of the division 
          //it will be zero when rotation is a multiple of 5. 
if(val2 > 0) 
    val += 1; 
direction = _cannon.rotation - 2*val; 

我不知道这是你想要的,我没有测试它。只是做了一些心理测试,看看它是否适用于你的案例。

但我希望你可以用它作为缩小代码的起点。

+0

大声笑...哇。非常感谢。我不能相信(约)40行代码变成了6,这对于正整数来说是完美的,但是我怎样才能解释负整数呢?例如。 0到-55 – Jonathan 2012-01-11 14:05:43

+0

我是个白痴。我从来没有试过把旋转除以2直到我看到你的答案。我所要做的只是int r = cannon.rotation/2,它适用于正整数和负整数 – Jonathan 2012-01-11 14:30:30

+0

我认为这适用于负整数,您只需检查val2的绝对值即可。如: if(abs(val2)> 0) – 2012-01-11 15:25:22