C++ 无需按键,SFML精灵就会不断重复

C++ 无需按键,SFML精灵就会不断重复,c++,visual-c++,sfml,C++,Visual C++,Sfml,这段代码应该让我的精灵表改变它在图像中的位置, 尽管如此,它对任何按键都不太响应,但在没有任何键盘输入的情况下,它会从一个精灵快速切换到另一个精灵 以下是导致此类错误的代码: #include <SFML\Graphics.hpp> #include <iostream> int main() { sf::RenderWindow window; window.create(sf::VideoMode(1000, 600), "Ludus"); sf::Texture

这段代码应该让我的精灵表改变它在图像中的位置, 尽管如此,它对任何按键都不太响应,但在没有任何键盘输入的情况下,它会从一个精灵快速切换到另一个精灵

以下是导致此类错误的代码:

#include <SFML\Graphics.hpp>
#include <iostream>

int main() {

sf::RenderWindow window;
window.create(sf::VideoMode(1000, 600), "Ludus");
sf::Texture mTexture;
sf::Sprite  mPlayer;

enum Move { Left, Right};
sf::Vector2i source(1, Left);

if (!mTexture.loadFromFile("Image.png"))
{
    std::cout << "error" << std::endl;
};

mPlayer.setTexture(mTexture);

while (window.isOpen()) {

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) {
        source.y = Right;
    }
    else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) {
        source.y = Left;
    }

    source.x++;
    if (source.x * 97 >= 291)
        source.x = 0;

    mPlayer.setTextureRect(sf::IntRect(source.x * 97, source.y * 91, 97, 91));
    window.draw(mPlayer);
    window.display();
    window.clear(sf::Color(255, 255, 255, 0));
}
return 0;
}

frameCounter
被分配了值0、
switchFrame
100和
frameSpeed
650。

您不断更改
source.x
每一帧。如果您的意思是在“If”语句中,我很确定,如果没有这个部分,它不会播放任何精灵,但只播放中间的一个。请让我强调一下LogicStuff的评论:你在每一帧都不断地更改
source.x
。另外,想想(或者测量,实际上)处理一个帧需要多少时间。这就解决了它,它变得很快,我看不到发生了什么,所以我把它误认为是一个bug,但它做了它应该做的事情!你一直在改变
source.x
每一帧。如果你的意思是在'If'语句中,我很确定它不会播放没有这个部分的任何精灵,但只播放中间部分。请让我强调一下LogicStuff的评论:你一直在改变
source.x
每一帧。另外,想想(或者测量,实际上)处理一个帧需要多少时间。这就解决了它,它变得很快,我看不到发生了什么,所以我把它误认为是一个bug,但它做了它应该做的事情!
    frameCounter += frameSpeed * clock.restart().asSeconds();
    if (frameCounter >= switchFrame) {
        frameCounter = 0;
        source.x++;
    if (source.x * 97 >= mTexture.getSize().x)
        source.x = 0;
    }