如何基于按钮按下(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++;
}
而行之有效的语句是最后一个。其余的只是正常移动,没有任何加速。
我想知道如何让物体在其他方向上逐渐加速。
附言以防万一有人也想知道,我不能将"如果"更改为"同时"。当我更改它时,该程序根本无法运行。
附言当我将其他对象更改为"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 *... ;
。我希望这有帮助!
我认为您的解决方案需要两个更改:
- 加速度应该是一个常数。
- 速度必须是一个矢量。
我认为像下面这样修改你的代码应该有效(而不是测试(:
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;
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- 加速C++练习2.4
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 如何基于按钮按下(Ogre3D)逐渐加速对象
- C++ - 对象的平滑加速和减速
- 围绕另一个对象旋转的物体不断加速
- 如何在c++中加速返回指向对象的指针的函数