我正在尝试使用SFML并创建经典游戏Snake。
我已经成功地使蛇在一定时间后移动了一定量的像素。问题是游戏循环需要不同的时间来执行。因此,当我为每一个动作写出differtime时,它看起来像这样:
0.39和0.41的凸起并不好。它们使蛇有时移动得更慢而且看起来并不好。
时间应始终为0.25,以便蛇在屏幕上平稳运行。 这是我在gameloop中实现的代码(snake.getSpeed()函数返回4):
if(_clock.GetElapsedTime() > (1 / snake.getSpeed())){
std::cout << "Time: " << _clock.GetElapsedTime() << std::endl;
snake.changeDir(keyDown); //Change direction
snake.move(); //Move the snake
_clock.Reset();
}
处理器是否会变慢或者是否有人对如何使代码更好有另一种想法?
编辑:上面的IGNORE。实时缓冲器似乎是GetEvent函数。不知道为什么,但执行时需要0到0.2秒。这是我的测试代码:
//This is just i bit of code, therefore there's no ending brackets ;)
_clock.Reset();
while(_mainWindow.GetEvent(currentEvent)) {
std::cout << _clock.GetElapsedTime() << std::endl; //cout the elapsed time for GetEvent
(_ mainWindow是sf :: RenderWindow) 不知道这是否可以修复但是我没有回答问题,如果有人有了想法,那就太好了。谢谢!
答案 0 :(得分:4)
首先我建议你使用SFML 2,因为SFML 1.6已经维护了超过2。5年,有很多已知和丑陋的错误,缺少SFML 2的许多不错的功能。
接下来最好不要试图强制某个帧速率,因为有些因素无法真正做到这一点(操作系统中断,移动鼠标时发生很多事件等),而是进行移动取决于帧速率。 最简单的方法是使用Euler method:
pos.x = pos.x*velocity.x*dt
其中pos
是对象位置的向量,velocity
是二维速度的向量,dt
是增量时间,即两帧之间的时间。
不幸的是,简单的欧拉方法不是很精确,也许Verlet integration可以使运动更平稳。
但这也不是全部,因为即使现在运动更紧密地绑定到帧速率,仍会出现尖峰并导致不必要的效果。因此,最好修复您的时间步长,因此使用它的FPS(每秒帧数)计数的渲染与物理计算无关。还有很多方法,我发现有用的一篇文章是that one。