我正在用C语言编写一个简单的游戏,使用SDL,我定义了player one控制它,例如用键盘上的箭头键控制它,player two控制它,用键盘上的“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键,没有一个可以移动他们的坦克。

最佳答案

您似乎依赖于操作/窗口系统的按键重复功能,在一些初始暂停后以固定间隔重复上次按下的按键,例如,当您在文本编辑器中保持按键时,它在一段延迟后开始填充该符号。不过,只有最后一个键是重复的。
使用SDL,您应该知道何时从keyboard eventrepeat字段重复键。但是,您几乎不想根据按键事件进行长时间的移动。根据你目前的方案,我可以很快按下一个键,坦克将移动得更快,或者我可以修改我的操作系统重复间隔。移动,如果应该在恒定的速度,应该依赖于时间,而不是用户按下按钮的速度。这就是为什么你只需要采取“确定,按钮A按下,—只要它按下,我将尝试在每个固定的更新间隔向左旋转”,当你得到释放的关键事件-你放弃的意图。
正如Danny_ds所说,在SDL中使用键状态数组而不是事件(主要是因为重复)通常更容易和健壮,您可以通过SDL_GetKeyboardState获得它。创建update_movements或任何函数,并每隔N毫秒调用一次。

关于c - 如何在sdl中同时使用键盘的两个键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54366223/

10-13 08:07