SFML 2实时文本输入?(无事件循环)

时间:2014-08-15 03:21:44

标签: c++ sfml

我正在写一个SFML程序,主窗口是在Window.cpp类中处理的。我还有一个处理不同屏幕的ScreenManager类。在我的newMapScreen类中,我需要从用户那里获取文本输入,以命名他们正在创建的Map。我通过在这个newMapScreen类中传入Window来创建一个事件循环,但是它非常缓慢地记录事件。在程序注册输入的密钥之前,用户必须按住按钮1秒以上。我需要得到实时文本输入,就像做if(sf :: Keyboard :: isKeyPressed(sf :: Keyboard ::: Key))。还有什么方法我可以使用键盘而不检查键盘上的每个键?无论如何,我可以处理来自窗口类的textinput并在我的newMapScreen类中执行它吗?我很难理解对不起的家伙。 我目前得到这样的输入:

   void newMapScreen::updateWithWindow(sf::RenderWindow &Window)
{
  while(Window.pollEvent(event))
    {
        switch(event.type)
        {
       case sf::Event::TextEntered:
           if(onEnterMap)
            {
               if(event.text.unicode >= 32 && event.text.unicode <= 126)
                {
               mapNameS += (char)event.text.unicode;
                }else if(event.text.unicode == 8 && mapNameS.getSize() > 0)
                {
                  mapNameS.erase(mapNameS.getSize() -1, mapNameS.getSize());
                }
            }
           if(onMapSizeX)
            {

            }
           if(onMapSizeY)
            {

            }
        break;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我把它扔在一起就是一个例子。这可能不是最好的方法,这只是一个例子。

#include <SFML/Graphics.hpp>
#include <string>
#include <iostream>

int main(){
    sf::RenderWindow window(sf::VideoMode(500,500), "Text reader!");

    std::string s;

    while(window.isOpen()){

        //Event processing.
        sf::Event event;
        while (window.pollEvent(event)){
            if (event.type == sf::Event::Closed)
                window.close();
            if (event.type == sf::Event::TextEntered){
                if(event.KeyPressed == sf::Keyboard::BackSpace && s.size()!=0){
                    s.pop_back();
                    std::cout << s << std::endl;
                }
                else if (event.text.unicode < 128) {
                    s.push_back((char)event.text.unicode);
                    std::cout << s << std::endl;
                }
            }
        }
    }
}