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

时间:2017-11-19 06:40:35

标签: c++ keyboard-events ogre3d acceleration

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

我现在的代码是:

    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。万一有人也想知道,我不能将“if”改为“while”。当我改变它时程序根本不运行。

P.P.S 当我将其他对象更改为“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++;
    }

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

3 个答案:

答案 0 :(得分:0)

加速度应该是一个常数,除非您希望加速加速。所以在一些图形中,我已经完成了关键输入,我有一个名为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 *... ;。我希望这有帮助!

答案 1 :(得分: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;
}

(我知道看起来很糟糕ahahaha)在不再按下时将速度和加速度重置为正常(因此它可以再次逐渐增加)。仍然很好奇为什么没有mAcceleration++它将无法工作。

另一种解决方法是

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

答案 2 :(得分:0)

我认为您的解决方案需要进行两项更改:

  1. 加速应该是一个常数。
  2. 速度必须是矢量。
  3. 我认为修改代码如下所示应该有效(不是testet):

    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;