在SFML中移动精灵的问题看起来很滞后(因为sf :: Clock)

时间:2012-12-20 09:49:38

标签: time sfml

我正在尝试使用SFML并创建经典游戏Snake。

我已经成功地使蛇在一定时间后移动了一定量的像素。问题是游戏循环需要不同的时间来执行。因此,当我为每一个动作写出differtime时,它看起来像这样:

  • 时间: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,以便蛇在屏幕上平稳运行。 这是我在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) 不知道这是否可以修复但是我没有回答问题,如果有人有了想法,那就太好了。谢谢!

1 个答案:

答案 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