SDL 文本输入返回白色方块

SDL Text Input returning white squares

我创建了一个事件 class 并想通过它获取文本。不幸的是文本没有正确阅读...

我已将其设置为在输入新键时将所有获得的文本输出到命令行,但显然它不起作用。

这是我的 "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,没找到问题

其他一些注意事项:

我开始在 "main.cpp" class:

中输入文字
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;
}

我在 "EventManager.h" 中创建了一些变量:

bool shouldCollectText;
std::string currentCollectedText;

并在 "init()" 函数中定义它们:

shouldCollectText = false;
currentCollectedText = "";

您的问题是您使用了错误的事件类型。再看一下 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;
        }
    }
}