Линейные Импульсы - Cocos2d / Objective-C / Box2d - PullRequest
0 голосов
/ 11 января 2012

У меня есть пушка, шар и спусковой крючок. При нажатии на курок к мячу прикладывается линейный импульс.

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 для вращения.

Е.Г.

от 0 до 55 градусов

от 0 до 5 вычесть 2 из вращения От 5 до 10 вычтите 4 из вращения От 10 до 15 вычесть 6 из поворота и т.д.

от 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 голосов
/ 11 января 2012
 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;

Я не уверен, что это то, что вы хотите, и я не проверял это.Просто сделал несколько мысленных тестов, чтобы увидеть, работает ли это для случаев, которые вы поставили.

Но я надеюсь, что вы можете использовать это как отправную точку для того, чтобы сделать ваш код меньше.

...