GLUT中的平滑移动
Smooth movement in GLUT
我制作了一个非常简单的引擎,基本上可以绘制一个字符,然后可以在屏幕上移动它。
但我以一种非常可怕的方式进行了这场运动,我的意思是,它是基于这样的离散值:
void Scene::movePlayer(int dir) {
switch (dir){
case 1: yy = yy + 0.05;
break;
case 2: xx = xx - 0.05;
break;
case 3:
yy = yy - 0.05;
break;
case 4:
xx = xx + 0.05;
break;
default:
break;
}
它起作用并移动角色,但我真的不喜欢它,因为它很跳跃,而且不流畅。
我希望有更流畅的动作,就像在马里奥或类似的动作。
你能告诉我如何做到这一点吗?
你想要的是加速度(也许还有减速——让我在回答时考虑一下)。
要遵循的步骤如下:
- 你的马里奥在
x
位置静止不动。将speed
设置为0.0
,将acceleration
设置为较小的值,例如0.01
- 用户按下左或右
- 只要用户不释放密钥,就继续将
acceleration
添加到speed
中,但一旦speed
达到合适的值(例如0.05
),就停止- 如果您希望Mario在松开键时滑动到停止,请将
acceleration
设置为负值,如-0.015
(通常大于加速时),并使用它来降低速度,直到其小于或等于0.0
。当它较少时,请确保将其重置为,精确地0.0
!浮点运算是不准确的,一个非常小的剩余值可能会让你的马里奥保持轻微的移动 - 只要用户不释放密钥,就继续将
此过程与整个游戏循环的实际时间密切相关。每个游戏帧只需要添加或减去acceleration
一次
可以使用可变的更新间隔(即,根据两次连续speed
更新之间的时间调整速度),但从固定帧速率开始更容易,例如每秒25或50帧。这样CCD_ 18可以是恒定的;可以通过试运行来估计正确的值。我想你在同样的过程中得到了xx = xx + 0.05;
。
同样的程序可以用于"跳跃"answers"坠落"。要跳跃,请将初始速度设置为一个高值,并在每个游戏循环中降低它。如果它低于0
,不要担心,那是有必要让上涨的东西再次下跌。若要下降,请将速度设置为0.0
,然后再次使用acceleration
增加速度。
如果你的马里奥沿着一条无限的直线移动,这会很好。然后你只需要关注他的yy
位置——它可能不会延伸到"地板"以下。如果你要添加不同的垂直水平来继续移动,你可以添加一个碰撞检查,用于向左和向右移动(使其完全停止,而不是滑动到停止)和向上和向下移动(同样,如果他跳起来并将头撞到什么东西上,则为完全停止,但随后是"摔倒",如果他离开什么东西,则增加速度,直到他撞到底部的块)。
相关文章:
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 自定义先决条件对移动分配运算符有效吗
- 返回值优化:显式移动还是隐式
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 可以使用移动语义更改或改进此C++代码吗?
- 使lambda不可复制/不可移动
- 使用具有设置延迟C++的mouse_event平滑鼠标移动
- SDL/C++: 如何平滑但随机地移动矩形?
- 使用 SDL2 平滑网格移动?
- 我试图将光标平滑地移动到随机点
- 鼠标在C++中平滑移动
- 使对象在 C++-SFML 中平滑移动
- GLUT中的平滑移动
- 在MFC中从左到右平滑地移动椭圆对象