无法识别键盘输入

时间:2014-11-23 08:42:49

标签: c++ input sdl sdl-2

每当我按下一个按键没有任何反应时,也没有任何错误,相反是奇怪的。

以下是init功能:

bool Game::init(int resx, int resy, bool fullscreen)
{
    tm = new TextureManager();
    int flags = 0;
    if(fullscreen)
    {
        flags = SDL_WINDOW_FULLSCREEN;
    }

    if(SDL_Init(SDL_INIT_EVERYTHING) >= 0)
    {
        g_pWindow = SDL_CreateWindow("Pong", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, resx, resy, flags);

        if(g_pWindow != 0)
        {
            g_pRenderer = SDL_CreateRenderer(g_pWindow, -1, 0);

            if(g_pRenderer != 0)
            {
                running = true;

                tm->load("/Users/WilsonKoder/C++P/projects/Pong/Pong/Images/bg.png", "bg", g_pRenderer);
                tm->load("/Users/WilsonKoder/C++P/projects/Pong/Pong/Images/paddle.png", "player1", g_pRenderer);
                tm->load("/Users/WilsonKoder/C++P/projects/Pong/Pong/Images/paddle.png", "player2", g_pRenderer);
                tm->load("/Users/WilsonKoder/C++P/projects/Pong/Pong/Images/ball.png", "ball", g_pRenderer);

                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }

    return false;
}

这是我的事件处理程序:

void Game::handleEvents()
{
    SDL_Event event;

    switch (SDL_PollEvent(&event)) {
        case SDL_KEYDOWN:
            p1MoveUp = true;
            break;
        case SDL_KEYUP:
            p1MoveUp = false;
            break;

        default:
            break;

    }
}

这是我的更新功能:

void Game::update()
{
    if (p1MoveUp)
    {
        std::cout << "asfasfasf" << std::endl; //for debug purposes :)
        p1YPos -= 5;
    }
}

最后但并非最不重要的是,这里是main.cpp(不包括......)

Game *g_game = 0;

int main(int argc, const char * argv[])
{
    g_game = new Game();
    g_game->init(800, 600, false);

    while(g_game->isRunning())
    {
        g_game->handleEvents();
        g_game->update();
        g_game->render();
    }

    g_game->clean();
    SDL_Quit();

    return 0;
}

2 个答案:

答案 0 :(得分:2)

您错误地使用了SDL_PollEvent。如果事件队列中仍有项目,则该函数不返回事件类型,而是返回1,如果队列为空,则返回0

所以,只要队列中有东西,你就想要轮询事件,然后对switch进行event.type这样的事情:

void Game::handleEvents()
{
    SDL_Event event;

    // Poll events until the queue is empty...
    while(SDL_PollEvent(&event)) {

        // ...then check the event.
        switch (event.type) {
            case SDL_KEYDOWN:
                p1MoveUp = true;
                break;
            case SDL_KEYUP:
                p1MoveUp = false;
                break;

            default:
                break;
        }    
    }
}

编辑:请注意,当前键盘上每个键的所有键向下和向上事件都会导致p1MoveUp标志切换。在SDL_KEYDOWNSDL_KEYUP中,您通常还会检查已按下哪个键并采取相应措施。你可以这样做:

if(event.key.keysym.sym == SDLK_UP) ...

这将检查是否已按下“向上光标”的键码。 键扫描码键码之间存在差异,我建议您检查后者,如上所示。您可以在此处找到所有这些SDL定义的密钥代码(查看最右侧的列):https://wiki.libsdl.org/SDL_Keycode

请注意,如果要检查不同的密钥和不同的密钥事件,事件处理程序可以快速增长,因此我建议您在熟悉事件机制后实现额外的类或其他封装方法。 SDL。

答案 1 :(得分:1)

SDL_PollEvent返回true或false。 https://wiki.libsdl.org/SDL_PollEvent

如果SDL_PollEvent返回true,则设置'event'。然后改为启用event.type。