Box2D (Cocos2D) Постоянная сила во времени - PullRequest
0 голосов
/ 14 июня 2011

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

Я изучал тонну вещей, изучая разработку игр для iOS, и натолкнулся на формулу, выполняя некоторые поиски. Вот формула:

x (t) = x (0) + v (0) * t + .5 (F / m) * t ^ 2

Также указано, что решает для х и у:

Fx = (x (t) - x (0) - vx (0) * t) * 2 м / т ^ 2

Fy = (y (t) - y (0) - vy (0) * t) * 2 м / т ^ 2

Источник: Форумы Box2D.org

Теперь для моего настоящего вопроса, что это значит? Имейте в виду, что в этой ситуации я идиот. Было бы здорово, если бы кто-то мог объяснить переменные в простых терминах и как они относятся к box2d. Как бы я применил эту формулу? Вот пример моего кода (стрельбы снарядами):

- (void)spawnProjectile:(CGPoint)from direction:(CGPoint)direction inParent:(CCNode*)parentNode
{
    double curTime = CACurrentMediaTime();

    double timeTillShotDies = curTime + SHOT_TYPE1_EXIST_TIME;

    b2Body *shotBody = projectileBodyTracker[nextShot];

    b2Vec2 moveToPosition = b2Vec2(from.x/PTM_RATIO, from.y/PTM_RATIO);
    shotBody->SetTransform(moveToPosition, 0.0);
    shotBody->SetActive(true);

    CCSprite *shot = [projectiles objectAtIndex:nextShot];
    shot.position = ccp(from.x/PTM_RATIO, from.y/PTM_RATIO);

    shot.visible = YES;
    [projectilesTracker replaceObjectAtIndex:nextShot withObject:[NSNumber numberWithDouble:timeTillShotDies]];
    CCParticleSystemQuad *particle = [projectileParticleTracker objectAtIndex:nextShot];
    [particle resetSystem];
    nextShot++;
    if(nextShot >= projectiles.count) nextShot = 0;

    // dx2 and dy2 are analog stick values (see below code)
    b2Vec2 force = b2Vec2(dx2, dy2);
    shotBody->SetLinearVelocity(force);

    [AudioController playLaserShot];
}

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

Итак, подведем итог: как решить постоянную силу во времени для x и y в терминах кода box2d?

Дополнительная информация:

dx2 = (float)joypadBG2.position.x - (float)convertedPoint.x;
dy2 = (float)joypadBG2.position.y - (float)convertedPoint.y;

Все объекты предварительно загружены и сохранены таким образом. Тела установлены неактивными, а спрайты - невидимыми. Системы частиц остановлены. Обратное верно для повторного использования снаряда.

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

Ответы [ 2 ]

1 голос
/ 14 июня 2011

Вот краткое объяснение:

x(t) = x(0) + v(0)*t + .5 (F/m) * t^2
Fx = (x(t) - x(0) - vx(0)*t) * 2m/t^2
Fy = (y(t) - y(0) - vy(0)*t) * 2m/t^2

Эти 3 уравнения являются стандартными уравнениями движения:

  • t: время
  • x(t): позиция во время t
  • v(t): скорость во время t
  • vx(t): горизонтальная составляющая скорости во времени t
  • vy(t): вертикальная составляющая скорости во времени t
  • m: масса
  • F: сила
  • Fx: горизонтальная составляющая силы
  • Fy: вертикальная составляющая силы

Поэтому, конечно, каждый раз, когда вы видите x(0) или vy(0), эти значения берутся в момент времени t, то есть они начальные значения . Эти уравнения основные кинематические уравнения с основными кинематическими переменными (положение, скорость, сила, масса).

1 голос
/ 14 июня 2011

Первое уравнение описывает движение объекта, который подвергается постоянной силе.Объект начинается с позиции x (0) и имеет скорость v (0).И x, и v являются векторами, поэтому в 2D-шутере x (0) будет (x0, y0) или xy-позицией, а v (0) будет (vx0, vy0).

Если силы тяжести нет, то F = 0 на неходовых снарядах (снарядах без движителей), поэтому скорость будет постоянной.

x (t1) = x (t0) + vx * (t1-t0) y (t1) = y (t0) + vy * (t1-t0)

t1-t0 или dt (delta-t) - время, прошедшее с момента последнего обновления позиции снаряда.

Если на объекте действует сила тока или сила тяжести, скорость будет меняться со временем.

vx (t1) = vx (t0) + ax * (t1-t0) vy (t1) = vy(t0) + ay * (t1-t0)

a - ускорение.В игре вам обычно не нужны масса и сила, только ускорение.В физике a = F / m.

Редактировать 1: В компьютерных играх вы очень часто обновляете положение объекта (обычно около 60 раз в секунду).У вас есть положение и скорость объекта в предыдущем обновлении, и вы хотите вычислить новую позицию.

Вы обновляете позицию, предполагая, что скорость была постоянной:

positionVectorAt(newTime) = positionVector(lastTime) + velocityVector*(newTime - lastTime);

Еслискорость объекта изменяется, вы также обновляете скорость:

velocityVectorAt(newTime) = velocityVector(lastTime) + accelerationVector*(newTime - lastTime);

Допустим, у нас есть спрайт в

positionVector.x=100; 
positionVector.y=10;

Начальная скорость

velocityVector.x = 3;
velocityVector.y = -10;

Спрайт использует двигатели, которые дают горизонтальное ускорение в секунду

thrusterVector.x= 5; 

, а также подвержены гравитации, которая дает вертикальное ускорение в секунду

gravityVector.y = -10;

Кодобновить позицию спрайтов будет:

deltaTime = now - lastTime; // Time elapsed since last position update

// Update the position
positionVector.x = positionVector.x + velocityVector.x * deltaTime;
positionVector.y = positionVector.y + velocityVector.y * deltaTime;

// Update the velocity
velocityVector.x = velocityVector.x + (thrusterVector.x + gravityVector.x) * deltaTime;
velocityVector.y = velocityVector.y + (thrusterVector.y + gravityVector.y) * deltaTime;

// Done! The sprite now has a new position and a new velocity!
...