使用SDL2库为C中的2个玩家进行键盘检测的问题

时间:2017-01-15 20:11:58

标签: c sdl-2

这是我第一次使用SDL2库。当我按下W和S(处理第一个玩家位置)时,按住它们,然后我按下键盘,没有任何反应。好奇的是,当我拿着W和S按钮时,其他按钮工作得很好。

当我以相反的方式(按住向上和向下按钮......)时,会发生同样的事情。

标题文件:

/**
 *  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

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

它与SDL无关,它是你的键盘。普通键盘不能同时处理2-3个以上的键,并且只有当键不在同一行或列上时才能处理。有关wiki

的更多信息