我创建了一个事件类,并希望用它来获取文本。不幸的是,文字没有正确阅读......
我已对其进行设置,以便在输入新密钥时将所有获取的文本输出到命令行,但它显然无法正常工作。
这是我的" 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 = "";
答案 0 :(得分:4)
您的问题是您使用的是错误的事件类型。再看看Lazy Foo的教程,在这里:
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;
}
}
}