Не могу заставить ApplyForce () работать так, чтобы это имело смысл - PullRequest
0 голосов
/ 19 августа 2011

У меня проблема с использованием b2Body-> ApplyForce () в игре IOS / cocos2D / Box2D.У меня есть объект мяча, и я применяю силу, чтобы имитировать удар по клюшке для гольфа.Пользователь устанавливает угол и силу удара, затем нажимает кнопку «стрелять», чтобы выстрелить в мяч.Код, который я использую, следующий:

CGPoint ballPosition = game.theBall.position;
b2Vec2 force;
force.x = ((game.power*POWER_REDUCTION) * cos(game.angle))/PTM_RATIO; // cocos2D angle
force.y = ((game.power*POWER_REDUCTION) * sin(game.angle))/PTM_RATIO;
CCLOG(@"Force: %f, %f", force.x, force.y);
CCLOG(@"Angle: %.4f", game.angle);
b2Vec2 point = body->GetWorldPoint(b2Vec2(0.0f, 0.0f));
body->ApplyForce(force, point);

POWER_REDUCTION - это просто определенная константа, которую я использую при тестировании, чтобы я мог влиять на мощность выстрела и набирать правильные числа.В моем методе Update я переставляю спрайт, связанный с телом Box2D, которое он представляет:

GolfBallObject *ballSprite = [self getChildByTag:GOLF_BALL_SPRITE_TAG];
if (!ballSprite)
{
    CCLOG(@"in PlayLayer->update: [self getChildByTag:GOLF_BALL_SPRITE_TAG] returned nil");
}

b2Vec2 p = theBall->GetWorldPoint(b2Vec2(0.0f, 0.0f));
CGPoint newPosition = ccp(p.x*PTM_RATIO, p.y*PTM_RATIO);
ballSprite.position = newPosition;
game.theBall.position = newPosition;

        CCLOG(@"In Flight - ball position: %.2f, %.2f", game.theBall.position.x, game.theBall.position.y);

theBall - это b2Body, привязанный к моему шаровому спрайту.

Независимо от того, как яотрегулируйте приложенную силу, мяч следует за тем же полетом:

Shooting - ball position: 120.00, 455.00
Force: -0.004102, 0.004030
Angle: 14.9314
In Flight - ball position: -1441.75, -731.84
In Flight - ball position: -3015.97, -1961.38
In Flight - ball position: -4591.16, -3192.20

другой:

Shooting - ball position: 120.00, 455.00
Force: -0.410169, 0.402972
Angle: 14.9314
In Flight - ball position: -1441.75, -731.84
In Flight - ball position: -3015.97, -1961.38
In Flight - ball position: -4591.16, -3192.20

Вот один, где я меняю угол:

Shooting - ball position: 120.00, 455.00
Force: -0.561694, 0.122985
Angle: 78.3243
In Flight - ball position: -1441.75, -731.84
In Flight - ball position: -3015.97, -1961.38
In Flight - ball position: -4591.16, -3192.20

IЯ никогда раньше не использовал Box2D, так что я уверен, что мне чего-то не хватает, что, вероятно, элементарно, но это поведение кажется совершенно иррациональнымИ угол, и сила кажутся несущественными.Подскажите, пожалуйста, что я делаю не так?

Спасибо!

-Дик

1 Ответ

2 голосов
/ 19 августа 2011

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

...