Как использовать две клавиши клавиатуры одновременно в SDL - PullRequest
0 голосов
/ 25 января 2019

Я пишу простую игру на C с SDL, и я определил, что игрок один управляет it_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 голосов
/ 25 января 2019

Похоже, вы полагаетесь на повтор ключа - функция операционной / оконной системы повторяет последнюю нажатую клавишу с фиксированным интервалом после некоторой начальной паузы, например, когда вы удерживаете клавишу нажатой в текстовом редакторе, она начинает заполнять этот символ после некоторой задержки.Повторяется только последняя клавиша.

С SDL вы должны знать, когда клавиша повторяется из repeat поля события клавиатуры .Тем не менее, вы почти никогда не хотите делать длительные движения на основе события нажатия клавиши.При вашей нынешней схеме я могу очень быстро нажимать клавишу, и танк будет двигаться быстрее, или я могу изменить интервал повторения ОС.Движение, если предполагается, что оно происходит с постоянной скоростью, должно зависеть от времени, а не от того, насколько быстро пользователь может нажать кнопку.Вот почему вам нужно только взять слово «хорошо, кнопка А нажата, - пока она нажата, я буду пытаться поворачивать влево с каждым фиксированным интервалом обновления», а когда вы получаете событие, отпускаемое клавишей, - вы отбрасываете это намерение..

Как сказал Danny_ds, часто гораздо проще и надежнее использовать массив состояний ключей вместо событий (в основном из-за повтора) - с SDL вы можете получить это через SDL_GetKeyboardState .Сделайте вашу update_movements или любую другую функцию и вызывайте ее каждые N миллисекунд.

0 голосов
/ 25 января 2019

В Windows вы можете использовать функцию GetAsyncKeyState () .

Эквивалент в Linux см. в этом вопросе .

...