SDL文本输入返回白色方块

时间:2016-02-05 20:28:28

标签: c++ input sdl true-type-fonts

我创建了一个事件类,并希望用它来获取文本。不幸的是,文字没有正确阅读......

The command line

我已对其进行设置,以便在输入新密钥时将所有获取的文本输出到命令行,但它显然无法正常工作。

这是我的" EventManager"我的更新功能的代码:

void EventManager::update(){
    while(SDL_PollEvent(&e)){

        switch(e.type){
            case SDL_QUIT:
                running = false;
                break;
            case SDL_MOUSEBUTTONDOWN:
                mousePressed = true;
                break;
            case SDL_KEYDOWN:
                if(shouldCollectText && e.key.keysym.sym == SDLK_BACKSPACE && currentCollectedText.length() > 0){
                    currentCollectedText.pop_back();
                }else if(shouldCollectText && e.key.keysym.sym != SDLK_BACKSPACE){
                    currentCollectedText += e.text.text; //The problem
                    std::cout << currentCollectedText << std::endl;
                }
        }
    }
}

我跟着the Lazy Foo tutorials,我找不到问题。

其他一些注意事项:

我在我的&#34; main.cpp&#34;中开始输入文字。类:

int main( int argc, char *argv[] ) {
    Game *game = new Game();
    game->init();

    SDL_StartTextInput();

    while(game->isRunning()){
        game->handleEvents();
        game->update();
        game->render();
    }

    game->close();
    SDL_StopTextInput();
    return 0;
}

我在&#34; EventManager.h&#34;:

中创建了一些变量
bool shouldCollectText;
std::string currentCollectedText;

并在&#34; init()&#34;中定义它们。功能:

shouldCollectText = false;
currentCollectedText = "";

1 个答案:

答案 0 :(得分:4)

您的问题是您使用的是错误的事件类型。再看看Lazy Foo的教程,在这里:

TextInputEvent

e.text.text保留用于文本输入事件,而不保留任何其他内容。由于SDL_Event是结构的并集,所以在使用的存储器中可能发生重叠。这正是您在终端输出中看到的内容。

删除SDL_KEYDOWN事件并改为尝试:

case SDL_TEXTINPUT:
     currentCollectedText += e.text.text;
     break;

我不确定std::cout << currentCollectedText << std::endl;。这取决于您希望何时输出文本内容。

如果你想使用SDL_KEYDOWN,你必须访问keysym表,并计算它们对应的字母并打印出来。我想说,对于你想要实现的目标,这种方法更为复杂。

总而言之,e.text.text仅在e.type具有SDL_TEXTINPUT值作为事件时才有效。使用代码中的所有其他设置,应该触发事件,并且可以获取您键入的文本。

所以你的完整例子看起来像这样:

void EventManager::update(){
    while(SDL_PollEvent(&e)){

        switch(e.type){
            case SDL_QUIT:
                running = false;
                break;
            case SDL_MOUSEBUTTONDOWN:
                mousePressed = true;
                break;
            case SDL_TEXTINPUT:
                if(shouldCollectText && currentCollectedText.length() > 0){
                    currentCollectedText.pop_back();
                }else if(shouldCollectText) {
                    currentCollectedText += e.text.text; //The problem
                    std::cout << currentCollectedText << std::endl;
                }
                break;
           default: break;
        }
    }
}