2017-01-15 7 views
0

Это мой первый опыт использования библиотеки SDL2. Когда я нажимаю W и S (обрабатывая позицию первого игрока), удерживайте их, а затем я нажимаю UP на клавиатуре, ничего не происходит. Любопытно, что другие кнопки работают нормально, пока я держу кнопки W и S.Проблема с обнаружением клавиатуры с использованием библиотеки SDL2 для 2 игроков в C

То же самое происходит, когда я делаю это наоборот (удерживая кнопки UP и DOWN ...).

Заголовочный файл:

/** 
* Header file for theGame. 
* 
*/ 

#include <SDL2/SDL_ttf.h> 

// macro definitions 
#define HEIGHT 540 
#define WIDTH 960 
#define SPEED 300 
#define MAXBULLETS 1000 
#define BULLETSPEED 700 


// structs definitions 
typedef struct{ 
    bool up, down, left, right, up2, down2, left2, right2; 
    bool p1Shooting, p2Shooting; 
} Action; 

typedef struct{ 
    int x; 
    int y; 
    bool walking, shooting, alive, facingLeft; 
    int currentSprite; 
    int hp; 

    SDL_Texture *sheetTexture; 
} Man; 

typedef struct{ 
    int x, y; 
    bool display; // is it on the screen 
    bool goingRight; 
} Bullet; 

typedef struct{ 
    Man *p_p1; 
    Man *p_p2; 
    Bullet *bullets; 

    Action *action; 
    SDL_Texture *bulletTexture; 

    int frames; 

} gameState; 

/** 
* Function detects keyboard actions. 
*/ 
void eventsDetection(SDL_Event *event, Action *action, bool *running); 
//other stuff 
void renderStuff(SDL_Renderer *renderer, gameState game); 
void logicStuff(gameState game); 
int isInWindow(int x, int y); 
void drawText(SDL_Renderer *renderer, char *text, int x, int y); 

Проблематика функция:

#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h> 

#include <SDL2/SDL.h> 
#include <SDL2/SDL_image.h> 
#include <SDL2/SDL_timer.h> 
#include <SDL2/SDL_ttf.h> 

#include "theGame.h" 

void eventsDetection(SDL_Event *event, Action *p_action, bool *running) 
{ 
    switch(event->type) 
      { 
       case SDL_QUIT: 
        *running = false; 
        break; 
       case SDL_KEYDOWN: 
        switch (event->key.keysym.scancode) 
        { 
         case SDL_SCANCODE_W: 
          p_action->up = true; 

          break; 
         case SDL_SCANCODE_S: 
          p_action->down = true; 
          break; 

         case SDL_SCANCODE_D: 
          p_action->right = true; 
          break; 

         case SDL_SCANCODE_A: 
          p_action->left = true; 
          break; 

         case SDL_SCANCODE_SPACE: 
          p_action->p1Shooting = true; 
          break; 

        } 
        break; 
       case SDL_KEYUP: 
        switch (event->key.keysym.scancode) 
        { 
         case SDL_SCANCODE_W: 
          p_action->up = false; 
          break; 

         case SDL_SCANCODE_S: 
          p_action->down = false; 
          break; 

         case SDL_SCANCODE_D: 
          p_action->right = false; 
          break; 

         case SDL_SCANCODE_A: 
          p_action->left = false; 
          break; 

         case SDL_SCANCODE_SPACE: 
          p_action->p1Shooting = false; 
          break; 

        } 
        break; 
      } 

      switch(event->type) 
      { 
       case SDL_QUIT: 
        *running = false; 
        break; 
       case SDL_KEYDOWN: 
        switch (event->key.keysym.scancode) 
        { 
         case SDL_SCANCODE_UP: 
          p_action->up2 = true; 
          break; 

         case SDL_SCANCODE_DOWN: 
          p_action->down2 = true; 
          break; 

         case SDL_SCANCODE_RIGHT: 
          p_action->right2 = true; 
          break; 

         case SDL_SCANCODE_LEFT: 
          p_action->left2 = true; 
          break; 

         case SDL_SCANCODE_P: 
          p_action->p2Shooting = true; 
          break; 

        } 
        break; 
       case SDL_KEYUP: 
        switch (event->key.keysym.scancode) 
        { 

         case SDL_SCANCODE_UP: 
          p_action->up2 = false; 
          break; 

         case SDL_SCANCODE_DOWN: 
          p_action->down2 = false; 
          break; 

         case SDL_SCANCODE_RIGHT: 
          p_action->right2 = false; 
          break; 

         case SDL_SCANCODE_LEFT: 
          p_action->left2 = false; 
          break; 

         case SDL_SCANCODE_P: 
          p_action->p2Shooting = false; 
          break; 

        } 
        break; 
      } 

    /*printf("----------------------\nACTIONS\n" 
      "1p: %d up, %d down, %d left, %d right\n" 
      "2p: %d up, %d down, %d left, %d right\n", 
      p_action->up,p_action->down,p_action->left,p_action->right, 
      p_action->up2,p_action->down2,p_action->left2,p_action->right2 
      );*/ 
} 

И, наконец, важной частью основной:

// Animation loop 
while(running) 
{ 
    // events processing 
    while(SDL_PollEvent(&event)) 
    { 
     eventsDetection(&event, p_action, &running); 
    } 

    // logic stuff 
    logicStuff(game); 

    // rendering 
    renderStuff(renderer, game); 

    // Show what was drawn 
    SDL_RenderPresent(renderer); 

    game.frames = game.frames + 1; 

} // end of animation loop 

Большое спасибо за помощь.

ответ

2

Это не имеет ничего общего с SDL, это ваша клавиатура. Обычная клавиатура не обрабатывает более 2-3 ключей одновременно и только если ключи не находятся в одной строке или столбце. Дополнительная информация о wiki