线性脉冲 - Cocos2d / Objective-C / Box2d

时间:2012-01-11 06:06:39

标签: iphone objective-c cocos2d-iphone 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 从旋转中减去4到5到10 从旋转中减去6到10到15 等

0至-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;
    }

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

1 个答案:

答案 0 :(得分: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;

我不确定这是不是你想要的,我也没有测试过。刚刚进行了一些心理测试,看它是否适用于您所放置的案例。

但我希望您可以将此作为缩小代码的起点。