你如何根据按钮的按下来逐渐加速一个物体(Ogre3D)?
How do you gradually accelerate an object based on button press (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 为了以防万一有人也想知道,我无法将 "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++;
}
但它仍然没有沿对角线移动
加速度应该是一个常数,除非你想让加速度加速。所以在一些图形中,我已经完成了关键输入,我有一个名为 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 语句
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;
我认为您的解决方案需要进行两处更改:
- 加速度应该是常数。
- 速度必须是矢量。
我认为像下面这样修改你的代码应该可行(不是 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;
我目前有一个对象,我想逐渐加速。您按住某个键的时间越长,它运行的速度就越快。我设法让它在一个键上正常工作(当它向右移动时)但是,它似乎不适用于其他方向。
我现在的密码是:
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++;
}
但它仍然没有沿对角线移动
加速度应该是一个常数,除非你想让加速度加速。所以在一些图形中,我已经完成了关键输入,我有一个名为 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 语句
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;
我认为您的解决方案需要进行两处更改:
- 加速度应该是常数。
- 速度必须是矢量。
我认为像下面这样修改你的代码应该可行(不是 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;