【问题标题】:SFML 2 Real Time Text Input?(No Event Loop)SFML 2 实时文本输入?(无事件循环)
【发布时间】:2014-10-08 20:35:03
【问题描述】:

如果主窗口在 Window.cpp 类中处理,我正在编写一个 SFML 程序。我还有一个 ScreenManager 类来处理不同的屏幕。在我的 newMapScreen 类中,我需要从用户那里获取文本输入来命名他们正在创建的地图。我通过在这个 newMapScreen 类中传入 Window 创建了一个事件循环,但它注册事件的速度非常慢。用户必须按住按钮 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;
        }
    }
}

【问题讨论】:

  • 先检查sf::event!然后检查是否是键盘事件。

标签: c++ sfml


【解决方案1】:

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

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

【讨论】:

  • 大概吧!请参阅:sfml-dev.org/tutorials/2.0/window-events.php,引用:与此事件关联的成员是 event.text,它包含输入字符的 Unicode 值。您可以将其直接放入 sf::String 中,也可以在确保它在 ASCII 范围内 (0 - 127) 后将其转换为 char。
  • 这混合了TextEnteredKeyPressed 事件类型处理,所以这是错误的。如果我们假设event.type == sf::Event::TextEntered,那么我们可以访问的唯一有效成员是event.text.unicode
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2013-12-12
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多