簡體   English   中英

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

[英]The better way to control player in 2d game ? (sdl2)

我在 .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;
    }
}}

像這樣我可以按下任意鍵然后松開它,玩家移動得很好。 如果按下兩個相反的鍵然后釋放一個鍵,它也可以工作,這樣玩家就會朝着正確的方向前進。 我們可以讓它更容易嗎? (對不起我的英語不好)

您可以在每個方向僅存儲一個變量,並在按下和釋放按鈕時加減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 X 將為0 ,並且 y 方向和velocityY Y 相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM