【问题标题】:sdl getting continuously key pressingsdl不断按键
【发布时间】:2016-04-20 14:50:34
【问题描述】:

我目前正在用 SDL(PONG 克隆)编写一个简单的游戏,我必须连续按键。

我遇到的问题是,当我按下按钮时,它会做出反应,等待一小段时间,然后继续连续按键。

我想知道我是如何让那一点延迟消失的。

这是我的代码:

while (running)
{
    while (SDL_PollEvent(&event))
    {
        //update the game
        if (event.type == SDL_QUIT)
        {
            quit_game();
            running = false;
        }

        if(event.type == SDL_KEYDOWN)
        { 
            switch (event.key.keysym.sym)   
            {

            case SDLK_DOWN:
                move_paddle(UP);
                break;

            case SDLK_UP:
                move_paddle(DOWN);
                break;

            default:

                break;
            }
        }   
    }
    draw_game();
    move_ball();
    SDL_Delay(15);
}

【问题讨论】:

  • 看起来好像您正在从自动重复事件中获得结果。 SDL_GetKeyboardState 花了我大约 5 秒钟的时间来谷歌“sdl 密钥状态”。

标签: c sdl keyevent


【解决方案1】:

我做的第一件事是我想消除小延迟并让桨的运动更顺畅。我引入了 2 个新的全局布尔变量来跟踪按下的键。

bool key_up = false;
bool key_down = false;

我使用值 false 启动它们,因为当前没有按下任何键。

在我的开关中,我将这些布尔变量的值设置为与当前按下的值相匹配。

        if(event.type == SDL_KEYDOWN)
        { 
            switch (event.key.keysym.sym)   
            {

            case SDLK_DOWN:
                key_up = true;
                key_down = false;
                break;

            case SDLK_UP:
                key_down = true;
                key_up = false;
                break;

            default:

                break;
            }
        }

然后在第一个 while 循环中,我为可以按下的两个键创建两个 if-case,并在这些 if-case 中调用移动函数。

    if (key_up)
        move_paddle(UP);
    else if (key_down)
        move_paddle(DOWN); 

当我这样做时,延迟消失了,桨的运动很平稳,但它也产生了另一个问题,桨不能在一个地方静止不动(边界除外)。然后我意识到代码只是在寻找一个被按下的键,而不是对释放的键做出反应。

然后我发现如果一个键被释放(在本例中是向上键或向下键),则两个布尔值必须设置为 false,因为没有按下任何键。

我所做的是在if(event.type == SDL_KEYDOWN) 之后创建了另一个 if 语句,如果没有按下任何键,则该语句将禁用桨叶的移动。

        if (event.type == SDL_KEYUP)
        {
            key_down = false;
            key_up = false;
        }

当我在我的代码中实现所有这些时,游戏就像一个魅力。

对于那些感兴趣的人,这是我新的最终代码:

int gameloop()
{
SDL_Event event;
bool running = true;
bool key_up = false;
bool key_down = false;

while (running)
{
    while (SDL_PollEvent(&event))
    {
        //update the game
        if (event.type == SDL_QUIT)
        {
            quit_game();
            running = false;
        }

        if(event.type == SDL_KEYDOWN)
        { 
            switch (event.key.keysym.sym)   
            {

            case SDLK_DOWN:
                key_up = true;
                key_down = false;
                break;

            case SDLK_UP:
                key_down = true;
                key_up = false;
                break;

            default:

                break;
            }
        }

        if (event.type == SDL_KEYUP)
        {
            key_down = false;
            key_up = false;
        }
    }
    if (key_up)
        move_paddle(UP);
    else if (key_down)
        move_paddle(DOWN);

    move_ball();
    ai_paddle_move();
    draw_game();
    printf("Player: %d   |   AI: %d\n", player, ai);
    SDL_Delay(15);
}

return 1;
} 

【讨论】:

    猜你喜欢
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    相关资源
    最近更新 更多