SDL2事件处理 - 密钥按下时不应排队

时间:2015-10-04 21:14:43

标签: c++ input event-handling sdl

在过去的一周里,我一直在努力学习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;
    }

0 个答案:

没有答案