2013-05-02 78 views
2

所以我一直在寻找几个小时,我似乎找不到任何东西来帮助我,所以我会开始说我是新的,就像很新,但我要明白,为了在不同的帧率下保持恒定的移动速度,我需要合并速度并确定自循环的最后一次迭代以来流逝的时间。sfml 2.0中的流速和时间

因此,这是我迄今为止

#include <SFML/Graphics.hpp> 

int main() 
{ 
sf::RenderWindow window(sf::VideoMode(800, 600, 32), "Oliver Rules!"); 

float speed = 20.f; 
float locX = 0.f; 
float locY = 0.f; 

sf::CircleShape circleOne(50); 
circleOne.setFillColor(sf::Color(200, 40, 200)); 

sf::Clock clock; 


while (window.isOpen()) 
{ 
    sf::Event event; 
    while (window.pollEvent(event)) 
    { 
     if (event.type == sf::Event::Closed) 
      window.close(); 
    } 



    sf::Time elapsed1 = clock.restart(); 

    if(sf::Keyboard::isKeyPressed(sf::Keyboard::A)) 
     { 
      locX -= speed * elapsed1; 
     } 
    if(sf::Keyboard::isKeyPressed(sf::Keyboard::D)) 
     { 
      locX += 0.1; 
     } 
    if(sf::Keyboard::isKeyPressed(sf::Keyboard::W)) 
     { 
      locY -= 0.1; 
     } 
    if(sf::Keyboard::isKeyPressed(sf::Keyboard::S)) 
     { 
      locY += 0.1; 
     } 


    circleOne.setPosition(locX, locY); 
    circleOne.move(locX, locY); 


    window.clear(); 
    window.draw(circleOne); 
    window.display(); 
} 

return 0; 
} 

我的问题是什么,是我不能添加或从我已开始成为我circleOne的位置不能被编辑因变量减到elapsed1是一个浮动我相信,所以我的问题是,我怎么得到这个工作?

回答

3

您的问题是speedelapsed1不是相同的类型。一个是float,另一个是sf::Time。如果您需要locX -= speed * elapsed1工作,则必须将elapsed1转换为float

为了做到这一点,您可以使用方法elapsed1.asSeconds,elapsed1.asMillisecondselapsed1.asMicroseconds,具体取决于您想要的单位种类。

如果您想了解更多信息,您应该查看SFML 2.0 documentation for sf::Time

+0

啊甜美我以为我必须转换过去,但我不知道如何,谢谢百万:) – user2342575 2013-05-02 11:04:35

+0

显然我不能upvote呢:(但我couldnt得到它的工作,这是我把,我不认为我正在写它,我之前已经阅读过这些文档,我明白我需要做什么,但不知道如何去做。虽然我会把这部分内容弄清楚,但感谢大家帮忙。 – user2342575 2013-05-02 11:53:51

+0

@ user2342575好的,没问题。希望你能用SFML 2.0获得乐趣:) – Morwenn 2013-05-02 12:08:43