Как вы постепенно ускоряете объект на основе нажатия кнопки (Ogre3D)?

В настоящее время у меня есть объект, который я хочу постепенно ускорить. Чем дольше вы удерживаете определенную клавишу, тем быстрее она идет. Мне удалось заставить его работать нормально для одного ключа (когда он движется вправо), однако, он не работает для других направлений.

Код, который у меня есть сейчас:

    if (mKeyboard->isKeyDown(OIS::KC_NUMPAD8))
{
mSpeed += mAcceleration*evt.timeSinceLastFrame;
movement.z -= mSpeed*evt.timeSinceLastFrame;
mAcceleration++;
}
if (mKeyboard->isKeyDown(OIS::KC_NUMPAD4))
{
mSpeed += mAcceleration*evt.timeSinceLastFrame;
movement.x -= mSpeed*evt.timeSinceLastFrame;
mAcceleration++;
}
if (mKeyboard->isKeyDown(OIS::KC_NUMPAD5))
{
mSpeed += mAcceleration*evt.timeSinceLastFrame;
movement.z += mSpeed*evt.timeSinceLastFrame;
mAcceleration++;
}
if (mKeyboard->isKeyDown(OIS::KC_NUMPAD6))
{
mSpeed += mAcceleration*evt.timeSinceLastFrame;
movement.x += mSpeed*evt.timeSinceLastFrame;
mAcceleration++;
}

И заявление, которое работает отлично, является последним. Остальные просто двигаются нормально, без какого-либо ускорения.

Мне было интересно, как я могу заставить объект постепенно ускоряться и в других направлениях.

P.S. На всякий случай, если кому-то интересно, я не могу изменить «если» на «время». Программа вообще не запускается, когда я ее меняю.

P.P.S
Объект работает (постепенно ускоряется во всех направлениях), когда я изменяю другие на «иначе, если», однако, я больше не могу двигаться по диагонали
что тоже моя проблема. Я пытался сделать что-то такое, как

else if (mKeyboard->isKeyDown(OIS::KC_I) && mKeyboard->isKeyDown(OIS::KC_J))
{
mSpeed += mAcceleration *evt.timeSinceLastFrame;
movement.z -= mSpeed*evt.timeSinceLastFrame;
movement.x -= mSpeed*evt.timeSinceLastFrame;
mAcceleration++;
}

но он все еще не движется по диагонали.

2

Решение

Ускорение должно быть постоянным числом, если только вы не хотите, чтобы ускорение ускорялось. Так что в некоторых графиках, которые я сделал с ключевыми вводами, у меня есть переменная boost или force, и я определяю ее как число. Тогда для утверждения if у меня будет:

if (mKeyboard->isKeyDown(OIS::KC_<whatever>)) {
object.boost();
} else { object.noBoost(); }

Где boost () — это функция, которая устанавливает логическое значение true в объекте. В функции обновления, где нарисован объект, я имею:

if (isBoosting) {
velocity += accel//where accel is a defined number
}

Вам не нужно добавлять все эти вещи, но вместо того, чтобы иметь mAcceleration++Я бы просто убрал это и определил его ускорение где-нибудь еще и mSpeed += acceleration *... ;, Надеюсь, это поможет!

0

Другие решения

Я думаю, что ваше решение нуждается в двух изменениях:

  1. ускорение должно быть постоянным.
  2. скорость должна быть вектором.

Я думаю, что изменение вашего кода, как показано ниже, должно работать (не тестирование):

if (mKeyboard->isKeyDown(OIS::KC_NUMPAD8))
{
mSpeed.z -= mAcceleration*evt.timeSinceLastFrame;
}
if (mKeyboard->isKeyDown(OIS::KC_NUMPAD4))
{
mSpeed.x -= mAcceleration*evt.timeSinceLastFrame;
}
if (mKeyboard->isKeyDown(OIS::KC_NUMPAD5))
{
mSpeed.z += mAcceleration*evt.timeSinceLastFrame;
}
if (mKeyboard->isKeyDown(OIS::KC_NUMPAD6))
{
mSpeed.x += mAcceleration*evt.timeSinceLastFrame;
}

movement += mSpeed*evt.timeSinceLastFrame;
0

Так что, видимо, мне просто нужно было добавить еще один оператор if

if (!mKeyboard->isKeyDown(OIS::KC_NUMPAD8) && !mKeyboard->isKeyDown(OIS::KC_NUMPAD4) && !mKeyboard->isKeyDown(OIS::KC_NUMPAD6) && !mKeyboard->isKeyDown(OIS::KC_NUMPAD2))
{
mSpeed = mSetSpeed;
mAcceleration = mSetAcceleration;
}

(Я знаю, что это выглядит плохо, ахахаха), чтобы восстановить нормальную скорость и ускорение (чтобы оно могло постепенно увеличиваться), когда на него больше не нажимают. Все еще любопытно, почему это не будет работать без mAcceleration++ хоть.

Другим способом решения этой проблемы является наличие

if(movement.length()==0) mSpeed = mSetSpeed;
else mSpeed += mAcceleration*evt.timeSinceLastFrame;
0