在过去的一周里,我一直在努力学习C ++(之前没有编程经验),现在正在使用Visual Studio 2015玩SDL2和SDL_TTF库。到目前为止,我已经能够解决大多数问题了。反对一些谷歌搜索和实验。然而,这个特殊问题令我难过。
我正在尝试制作一个基于RPG-esque文本框的对话系统,该系统使用SDL_TTF以打字机样式呈现文本。文本呈现都很漂亮但是我在处理输入时遇到麻烦,允许玩家推进文本。
在这个基本设置中,我希望播放器输入被禁用,直到所有文本都被渲染,然后播放器可以按鼠标按钮或SPACE或RETURN前进到下一个对话框。
我有基本的功能,但是有一个问题,如果玩家在文本完成渲染之前按下SPACE或RETURN,它将在文本呈现的瞬间前进,就像按键事件已经排队一样。
为了解决这个问题,我在文本渲染功能之后添加了SDL_FlushEvent函数,试图清除文本渲染时输入的任何按键的事件队列。但是,如果玩家不止一次按下某个键,它仍然会排队这些输入,然后在文本渲染功能完成后立即释放它们。
奇怪的是,鼠标按键的相同功能完全按预期工作 - 所有鼠标按钮输入都被忽略,直到文本完成渲染。
为什么鼠标按键排队正确,但按键队列似乎仍然存储值?
此特定部分的代码如下:
bool quit = false;
bool inputOn = false;
int eventcheck = 0;
// render and blit text
renderText(currentLine, currentChar);
// blit Text Box Arrow
SDL_BlitSurface(textBoxArrow, NULL, screenSurface, &textboxrect);
SDL_UpdateWindowSurface(window);
// start input handling
inputOn = true;
SDL_PumpEvents();
SDL_FlushEvent(SDL_MOUSEBUTTONDOWN);
SDL_FlushEvent(SDL_KEYDOWN);
while ((quit == false) && (inputOn == true) && (SDL_WaitEvent(&sdlEvent))) {
switch (sdlEvent.type) {
case SDL_QUIT:
quit = true;
inputOn = false;
break;
case SDL_MOUSEBUTTONDOWN:
eventcheck = 1;
std::cout << "Mouse button pressed! Eventcheck is: " << eventcheck << std::endl;
inputOn = false;
break;
case SDL_KEYDOWN:
if ((sdlEvent.key.keysym.sym == SDLK_SPACE || sdlEvent.key.keysym.sym == SDLK_RETURN) && sdlEvent.key.repeat == 0) {
eventcheck = 1;
inputOn = false;
std::cout << "SPACE or RETURN button pressed! Eventcheck is: " << eventcheck << std::endl;
}
if (sdlEvent.key.keysym.sym == SDLK_q) {
quit = true;
inputOn = false;
std::cout << "ESC button pressed! Eventcheck is: " << eventcheck << std::endl;
}
if ((sdlEvent.key.keysym.sym == SDLK_LALT || sdlEvent.key.keysym.sym == SDLK_RALT) && sdlEvent.key.keysym.sym == SDLK_F4) {
quit = true;
inputOn = false;
std::cout << "ALT-F4 button pressed! Eventcheck is: " << eventcheck << std::endl;
}
break;
}
std::cout << "In event handle loop" << std::endl;
}