如何基于按钮按下(Ogre3D)逐渐加速对象

How do you gradually accelerate an object based on button press (Ogre3D)?

本文关键字:加速 对象 Ogre3D 何基于 按钮      更新时间:2023-10-16

我目前有一个对象,我想逐渐加速。按住某个键的时间越长,它的速度就越快。我设法让它在一个键上正常工作(当它向右移动时(,但是,它似乎不适用于其他方向。

我现在的代码是:

    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++;
    }

而行之有效的语句是最后一个。其余的只是正常移动,没有任何加速。

我想知道如何让物体在其他方向上逐渐加速。

附言以防万一有人也想知道,我不能将"如果"更改为"同时"。当我更改它时,该程序根本无法运行。

附言当我将其他对象更改为"else if"时,该对象工作(逐渐向各个方向加速(,但是,我无法再对角线移动,这也是我的问题。我尝试过做一些事情,例如

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++;
    }

但它仍然没有对角线移动。

加速度应该是一个常数,除非你想加速加速。因此,在我使用关键输入完成的一些图形中,我有一个称为助推或力的变量,我将其定义为一个数字。然后,对于 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 *... ;。我希望这有帮助!

我认为您的解决方案需要两个更改:

  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;

所以显然,我只需要添加另一个 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;