在2D游戏中控制玩家的更好方法? (sdl2)

时间:2020-11-11 00:03:07

标签: c++ controls sdl-2

我正在.hpp文件中这样做:

class Player
{
public:
    Player(){}
    Player(){}
    virtual ~Player(){}

    void handler(SDL_Event event);
    void update()
    {
        move(velocityForwardX, velocityForwardY); 
        move(-velocityBackwardX, -velocityBackwardY);
        /* the player moves from it current position. */
    }
protected:
    int speed = 5;
    int velocityForwardX = 0;
    int velocityForwardY = 0;
    int velocityBackwardX = 0;
    int velocityBackwardY = 0;

};

.cpp文件中的

#include "Player.h"
void Player::handler(SDL_Event event)
{
if(event.type == SDL_KEYDOWN){
    switch(event.key.keysym.sym)
    {
    case SDLK_d:
        velocityForwardX = speed;
        break;
    case SDLK_q:
        velocityBackwardX = speed;
        break;
    case SDLK_z:
        velocityBackwardY = speed;
        break;
    case SDLK_s:
        velocityForwardY = speed;
        break;
    default:
        break;
    }
}
else if(event.type == SDL_KEYUP){
    switch(event.key.keysym.sym)
    {
    case SDLK_d:
        velocityForwardX = 0;
        break;
    case SDLK_q:
        velocityBackwardX = 0;
        break;
    case SDLK_z:
        velocityBackwardY = 0;
        break;
    case SDLK_s:
        velocityForwardY = 0;
        break;
    default:
        break;
    }
}}

这样,我可以按任意键并释放它,然后播放器移动良好。如果按下了两个相反的键,然后释放了一个,这样播放器就朝着正确的方向前进,那么它也可以工作。我们可以简化它吗? (对不起,我的英语)

1 个答案:

答案 0 :(得分:0)

每个方向只能存储一个变量,并在按下和释放按钮时加减speed,例如

    switch(event.key.keysym.sym)
    {
    case SDLK_d:
        velocityX += speed;
        break;
    case SDLK_q:
        velocityX -= speed;
        break;
    case SDLK_z:
        velocityY -= speed;
        break;
    case SDLK_s:
        velocityY += speed;
        break;
    default:
        break;
    }
    // similar for key release

如果同时按下相反的x方向键,则velocityX将为0,y方向和velocityY将相同。