SFML键盘输入延迟

时间:2013-01-13 08:01:54

标签: c++ keyboard sfml

我开始使用适用于C ++的SFML库,我来到一个地方,一切正常,但不是我喜欢的方式。

我的问题是,如何在没有那么小的延迟的情况下顺利地用键盘移动物体?

#include <SFML/System.hpp>
#include <SFML/Graphics.hpp>

using namespace sf;

const int SCREEN_WIDTH = 800;
const int SCREEN_HEIGHT = 600;

int main(){
VideoMode VMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32);
RenderWindow screen(VMode, "Empty Window");
Event event;
Keyboard key;
Color screencolor(0,150,0);
Texture pietexture;
pietexture.loadFromFile("image.png");
Sprite pie(pietexture);
pie.setPosition(150,150);
screen.draw(pie);
screen.display();
bool on = true;
while(on){
    screen.clear(Color(0,255,0));
    while(screen.pollEvent(event)){
        if(event.type == Event::Closed){
            screen.close();
            on = false;
        }
        else if(event.type == Event::KeyPressed){
            if(key.isKeyPressed(Keyboard::Left)){
                pie.move(-10,0);
            }
            if(key.isKeyPressed(Keyboard::Right)){
                pie.move(10,0);
            }
            if(key.isKeyPressed(Keyboard::Up)){
                pie.move(0,-10);
            }
            if(key.isKeyPressed(Keyboard::Down)){
                pie.move(0,10);
            }

        }
    }
    screen.draw(pie);
    screen.display();
}

}

它目前的作用是在按键后稍微停顿一下,然后正常进行,但是如果没有那个小停顿,我怎么能做到呢。

2 个答案:

答案 0 :(得分:2)

不是在按键事件上移动对象,而是设置一个变量来指示它应该移动的方向,以及以什么速度移动。然后,在键释放事件上,将速度重置为0.然后将事件处理与事件处理部分分开处理,由这些变量和某种计时系统的组合调节。

答案 1 :(得分:1)

使用sf::Keyboard::isKeyPressed(key)实时轮询关键状态。根据经验,不要使用需要高响应性界面的事件。

您还需要一个计时机制来调节速度。您可以使用sf::Clock来实现此目的。