无法识别键盘输入

Not recognizing keyboard input

本文关键字:输入 键盘 识别      更新时间:2023-10-16

每当我按下一个键时,什么都没有发生,也没有错误,这很奇怪。

这是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;
    }
}

最后但并非最不重要的一点是,这里是主要的.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;
}
您错误

地使用了SDL_PollEvent。该函数不返回事件类型,而是1事件队列中是否仍有项,或者0队列是否为空。

因此,只要队列中有内容,您就希望轮询事件,然后对event.type进行switch

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 的事件机制后实现额外的类或其他封装方法。

SDL_PollEvent返回真或假。 https://wiki.libsdl.org/SDL_PollEvent

如果SDL_PollEvent返回 true,则设置"事件"。然后改为打开 event.type。