【发布时间】:2012-12-07 19:18:39
【问题描述】:
我正在尝试 SFML,并正在创建经典游戏 Snake。
我已经成功地让蛇在一定时间后移动了一定数量的像素。问题是执行游戏循环需要不同的时间。所以当我写出每一步的不同时间时,它看起来像这样:
- 时间:0.273553
- 时间:0.259873
- 时间:0.260135
- 时间:0.396735
- 时间:0.258397
- 时间:0.262811
- 时间:0.259681
- 时间:0.257136
- 时间:0.266248
- 时间:0.412772
- 时间:0.260008
0.39 和 0.41 的凹凸不好。它们使蛇有时移动得更慢,而且看起来一点也不好看。
时间应始终为 0.25,以便蛇在屏幕上平稳运行。 这是我在游戏循环中实现的代码(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();
}
处理器只是变慢了还是有人对如何使代码更好有其他想法?
编辑:忽略上述。实时保险杠似乎是作为 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) 不知道这是否可以解决,但我没有回答问题,如果有人有想法,那就太好了。谢谢!
【问题讨论】:
-
在我看来,您希望以恒定的速度移动精灵。这里有一个相关的对话:en.sfml-dev.org/forums/index.php?topic=6284.0 简短的版本是你应该使用你想要的速度乘以自上次更新以来经过的时间量来计算蛇的位置。
-
我已经读过这个,但我不认为这是我需要的。相反,我每 2 秒移动一次蛇。不过有时间我会看看你的帖子。