如何在sdl中同时使用键盘的两个键

时间:2019-01-25 13:25:38

标签: c sdl

我正在用SDL用C编写一个简单的游戏,并且我定义了一个玩家用键盘的箭头键控制它是_for example_tank,而两个玩家用键“ W”,“ A”,“它”控制着坦克。键盘的S”,“ D”。

我的问题是他们无法同时按下按键。

我有一个名为“ handle_events”的函数,它可以在游戏的无限时间内控制事件,其代码如下:

int handle_events(Tank* tank,Tank* tanker, Wall walls[]){
    SDL_Event event;
    while (SDL_PollEvent(&event)) {
        if (event.type == SDL_QUIT)
            return EXIT;
        if (event.type == SDL_KEYDOWN){
            if(event.key.keysym.sym==SDLK_UP){
                move_tank_forward(tank,colliding(tank,walls));
            }else if(event.key.keysym.sym==SDLK_DOWN){
                move_tank_back(tank,colliding(tank,walls));
            } else if(event.key.keysym.sym==SDLK_RIGHT || event.key.keysym.sym==SDLK_LEFT) {
                turn_tank(event.key.keysym.sym, tank);
            } else if(event.key.keysym.sym==SDLK_w){
                move_tank_forward(tanker,colliding(tanker,walls));
            } else if (event.key.keysym.sym==SDLK_s){
                move_tank_back(tanker,colliding(tanker,walls));
            } else if(event.key.keysym.sym==SDLK_d || event.key.keysym.sym==SDLK_a){
                turn_tank(event.key.keysym.sym, tanker);
            }

        }

我正在寻找两个玩家可以同时玩耍的方式,因为例如,如果现在两个玩家同时按下向上键和w键,他们都无法移动坦克。

2 个答案:

答案 0 :(得分:0)

在Windows上,您可以使用GetAsyncKeyState()函数。

有关Linux上的等效内容,请参见this question

答案 1 :(得分:0)

您似乎依赖于按键重复-操作系统/窗口系统的功能是在一些初始暂停后以固定的间隔重复最后按下的按键,例如在文本编辑器中按住键时,经过一段时间的延迟,该符号开始填充该符号。不过只会重复最后一个键。

使用SDL,您应该知道何时从https://www.bios-mods.com/forum/Thread-Asus-N71JQ-enable-backlit-keyboardrepeat字段重复输入密钥。但是,您几乎永远都不想根据按键事件来长时间移动。使用您当前的方案,我可以非常快速地按一个键,然后槽会更快地移动,或者可以修改操作系统重复间隔。如果应该以恒定的速度运动,则应依靠时间,而不是用户可以按按钮的速度。这就是为什么您只需要采取以下概念:“确定,按下按钮A,-只要按下它,我将尝试在每个固定的更新间隔向左旋转”,而当您收到按键释放事件时,则放弃该意图

正如Danny_ds所说,使用键状态数组而不是事件(通常是因为重复)通常更容易且更可靠-使用SDL,您可以通过keyboard event来获得。使您的update_movements或任何函数,每N毫秒调用一次。