В настоящее время у меня есть объект, который я хочу постепенно ускорить. Чем дольше вы удерживаете определенную клавишу, тем быстрее она идет. Мне удалось заставить его работать нормально для одного ключа (когда он движется вправо), однако, он не работает для других направлений.
Код, который у меня есть сейчас:
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.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++;
}
но он все еще не движется по диагонали.
Ускорение должно быть постоянным числом, если только вы не хотите, чтобы ускорение ускорялось. Так что в некоторых графиках, которые я сделал с ключевыми вводами, у меня есть переменная 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 *... ;
, Надеюсь, это поможет!
Я думаю, что ваше решение нуждается в двух изменениях:
Я думаю, что изменение вашего кода, как показано ниже, должно работать (не тестирование):
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;
Так что, видимо, мне просто нужно было добавить еще один оператор 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;