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

SFML 2 Real Time Text Input?(No Event Loop)

本文关键字:事件 循环 实时 文本 输入 SFML      更新时间:2023-10-16

我正在写一个SFML程序,其中主窗口是在windows .cpp类中处理的。我也有一个ScreenManager类来处理不同的屏幕。在我的newMapScreen类中,我需要从用户获得文本输入,以命名他们正在创建的地图。我通过在这个newMapScreen类中传递窗口创建了一个事件循环,但是它注册事件的速度非常慢。用户必须按住按钮1秒以上,程序才能注册输入的密钥。我需要获得实时文本输入,就像做if(sf::Keyboard::isKeyPressed(sf::Keyboard:: Key))一样。也有任何方法,我可以使用键盘,而不检查键盘上的每个键?无论如何,我可以处理窗口类的文本输入,并在我的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;
        }
    }
}

我把这个放在一起作为一个例子。这可能不是最好的方法,这只是一个例子。

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