在sfml 2.0中经历的速度和时间

时间:2013-05-02 09:52:39

标签: c++ character velocity sfml

所以我现在一直在找几个小时,我似乎无法找到任何可以帮助我的东西,所以我首先会说我是新手,就像很新,但我明白为了有不同帧速率下的恒定移动速度我需要合并速度并确定自循环的最后一次迭代以来经过的时间。

所以这就是我到目前为止的作品

#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;
}

我的问题是,我无法添加或减去我发起的变量,因为我认为elapsed1是一个浮点数,因此无法编辑我的circleOne的位置,所以我的问题是,怎么做我这样做了吗?

1 个答案:

答案 0 :(得分:3)

您的问题是speedelapsed1的类型不同。一个是float,而另一个是sf::Time。如果您希望locX -= speed * elapsed1有效,则必须将elapsed1转换为float

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

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