【发布时间】:2015-11-03 23:11:54
【问题描述】:
我制作了一个非常简单的引擎,基本上可以绘制一个角色,然后您可以在屏幕上移动它。
但是我以一种非常可怕的方式进行了运动,我的意思是它基于这样的离散值:
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.05 值会在两个位置之间产生明显的“跳跃”,这很容易被注意到。当我减小这个值时,移动更平滑(因为跳跃更短),但它也使角色移动更慢(因为移动一段设定的距离需要更多的“跳跃”。)我不知道如何平衡它,使角色在屏幕上移动得相当快,但它也使它在非常小的跳跃中,所以看起来很流畅。
-
这是一个帧率问题。帧速率越快,移动步长越小,以便在同一时间段内从 A 到 B。那么如何检测角色应该移动并重绘场景呢?
-
我只有一个检测输入的函数:` void Keyboard(int key, int x, int y) { switch (key) { case GLUT_KEY_UP: s.movePlayer(1);休息; case GLUT_KEY_LEFT: s.movePlayer(2);休息; case GLUT_KEY_DOWN: s.movePlayer(3);休息; case GLUT_KEY_RIGHT: s.movePlayer(4);休息;默认值:中断; glutPostRedisplay(); }` 就是这样。当没有输入时,游戏不会做任何事情,因为我不知道如何制作,所以当没有输入时,游戏仍然会继续做一些事情(比如说动画背景或其他东西)
-
您需要在按键按下时将速度设置为某个值,在松开按键时将速度设置为零,即处理向下和向上消息,然后将此量应用于主循环中的位置.