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 的教程和这里:
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;
}
}
}
我创建了一个事件 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 的教程和这里:
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;
}
}
}