使用 SDL2 的函数返回错误的枚举值

Function using SDL2 returning wrong enum value

我在 C++ 中使用 SDL2。

我做了一个Playerclass。它包含来自 Input class.

的对象

我制作了两个 Player 对象。

Player 构造函数 Player() 中,我在成员 Input 对象 m_Controls 上调用 setControls()。然后我在同一对象上调用 keyPressed()。这两个函数都属于 class Input.

我的"error"在第89行,我在这里调用m_Controls.keyPressed(SDL_SCANCODE_W)

函数循环通过 Input 成员数组 m_Keys -- 玩家可以按下的键。如果它迭代的元素与传递给 keyPressed()SDL_Scancode 相匹配,它应该 return 来自 Controls 枚举的相应值。

#include <SDL2/SDL.h>
#include <iostream>

enum Controls {
    CONTROLS_INVALID=   -1,
    CONTROLS_QUIT_GAME,
    CONTROLS_UP,
    CONTROLS_RIGHT,
    CONTROLS_DOWN,
    CONTROLS_LEFT,
    CONTROLS_CONFIRM
};


class Input {
private:
    enum            {m_NumberOfKeys=    6};
    SDL_Scancode    m_Keys[m_NumberOfKeys];
    Controls        m_PressedKey;
public:
    Input(){}
    ~Input(){}

    void setControls(SDL_Scancode up, SDL_Scancode right, SDL_Scancode down, SDL_Scancode left, SDL_Scancode confirm){
        m_Keys[0]=  SDL_SCANCODE_ESCAPE;
        m_Keys[1]=  up;
        m_Keys[2]=  right;
        m_Keys[3]=  down;
        m_Keys[4]=  left;
        m_Keys[5]=  confirm;
    }

    Controls keyPressed(SDL_Scancode userInput){
        std::cout << "userInput: " << userInput << std::endl;
        for (int i = 0; i < m_NumberOfKeys; ++i){
            std::cout << i << ' ' << m_Keys[i] << std::endl;
            if (m_Keys[i] == userInput){
                switch (i) {
                    case CONTROLS_QUIT_GAME:
                        m_PressedKey=   CONTROLS_QUIT_GAME;
                        break;
                    case CONTROLS_UP:
                        m_PressedKey=   CONTROLS_UP;
                        break;
                    case CONTROLS_RIGHT:
                        m_PressedKey=   CONTROLS_RIGHT;
                        break;
                    case CONTROLS_DOWN:
                        m_PressedKey=   CONTROLS_DOWN;
                        break;
                    case CONTROLS_LEFT:
                        m_PressedKey=   CONTROLS_LEFT;
                        break;
                    case CONTROLS_CONFIRM:
                        m_PressedKey=   CONTROLS_CONFIRM;
                        break;
                    default:
                        m_PressedKey=   CONTROLS_INVALID;
                        break;
                }
            }
        }
        std::cout << "m_PressedKey: " << m_PressedKey << std::endl;
        return m_PressedKey;
    }
};


class Player {
private:
    static int  s_IdGenerator;
    int         m_Id;
    Input       m_Controls;
public:
    Player() {
        m_Id=   s_IdGenerator++;
        std::cout << "Making player " << m_Id << std::endl;
        switch (m_Id) {
            case 1:
                m_Controls.setControls(SDL_SCANCODE_W, SDL_SCANCODE_D, SDL_SCANCODE_S, SDL_SCANCODE_A, SDL_SCANCODE_SPACE);
                break;
            case 2:
                m_Controls.setControls(SDL_SCANCODE_UP, SDL_SCANCODE_RIGHT, SDL_SCANCODE_DOWN, SDL_SCANCODE_LEFT, SDL_SCANCODE_SPACE);
                break;
            default:
                break;
        }

        m_Controls.keyPressed(SDL_SCANCODE_W);
        std::cout << "==\n";
    }
    ~Player(){}



    Input&  getControls(){
        return m_Controls;
    }
};

int Player::s_IdGenerator=  1;


int main(int argc, char **argv) {
    SDL_Init(SDL_INIT_EVERYTHING);


    Player player1;
    Player player2;


    return 0;
}

根据上面的代码,keyPressed() return在我制作 `player`` 后如下:

Making player 1
userInput: 26
0 41
1 26
2 7
3 22
4 4
5 44
m_PressedKey: 1

到目前为止还不错。 SDL_SCANCODE_Wplayer1 的控件之一,因此 m_PressedKey 正确设置为 1。但这是创建 player2 时的输出:

Making player 2
userInput: 26
0 41
1 82
2 79
3 81
4 80
5 44
m_PressedKey: 0

由于 SDL_SCANCODE_W 不是 player2 控件的一部分,我希望将 m_PressedKey 设置为 -1。而是设置为 0

keyPressed() 得到无效的 SDL_Scancode 时,我必须更改什么才能使此代码设置 m_PressedKey-1

在ctor或keyPressed方法中初始化它; m_PressedKey = CONTROLS_INVALID;默认的 ctors 是邪恶的:)