简体   繁体   中英

Issue with keyboard detection using SDL2 library for 2 players in C

This is my first time using SDL2 library. When I push W and S (handling the first player position) hold them, and then I push UP on my keyboard, nothing happens. Curious is that other buttons work just fine while I am holding the W and S buttons.

The same thing happens when I do it the opposite way (holding the UP and DOWN buttons...).

Header file:

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

The problematic function:

#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
           );*/
}

And finally important part of main:

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

Thank you very much for help.

It's has nothing to do with SDL, it's your keyboard. A common keyboard doesn't handle more than 2-3 keys at the same time and only if the keys are not on the same line or column. More info on wiki

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM