我做了一个非常简单的引擎,它基本上绘制了一个角色,然后你可以在屏幕上移动它。
但是我以相当可怕的方式做了这个动作,我的意思是它基于这样的离散值:
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;
}
它起作用并移动角色,但我不喜欢它,因为它非常跳跃并且它不平滑。
我喜欢更平稳的运动,就像马里奥或类似的东西一样。
你能告诉我如何实现这个目标吗?
答案 0 :(得分:1)
你所追求的是加速(也可能是减速 - 让我在回答时考虑一下)。
要遵循的步骤如下:
x
位置。将speed
设置为0.0
和acceleration
设置为较小的值,例如0.01
。acceleration
添加到speed
并更新其排名。确保加速度具有正确的符号 - 向左移动为负,向右移动为正。acceleration
添加到speed
- 但只要speed
达到合适的值(0.05
,就会停止,例如)。acceleration
设置为负值,例如-0.015
(通常比加速时更多),并使用它降低速度,直到它小于或等于0.0
。如果不是,请务必将其重置为完全 0.0
!浮点运算是不准确的,剩余的非常小的值可能会让您的Mario继续轻微移动。此程序与整个游戏循环的实际时间紧密相关。您需要在每个游戏框架中仅添加或减去acceleration
一次
您可以使其可以使用可变更新间隔(即,根据两次连续speed
更新之间的时间调整速度)但是更容易从固定帧开始速率,例如每秒25或50帧。那样acceleration
可以是常数;可以通过试运行估算正确的值。我想你通过同样的过程最终得到了你的xx = xx + 0.05;
。
相同的程序可用于"跳跃" "下降"。要跳转,请将初始速度设置为较高值,并在每个游戏循环中减小它。不要担心它是否低于0
,这是必要的,以便再次下降。要降低速度,请将速度设置为0.0
并再次使用acceleration
增加速度。
如果您的马里奥沿无限直线移动,这将正常工作。然后你只需要留意他的yy
位置 - 它可能不会延伸到地板以下。如果您要添加不同的垂直水平以继续前进,您可以为左右移动(使其停止而不是滑动停止)以及上下移动(再次,死停止)添加碰撞检查如果他跳了起来,把头撞到了某个东西上,然后然后摔倒了,如果他走开了某个东西,就会越来越快,直到他撞到底部的一个街区。)