【问题标题】:Function using SDL2 returning wrong enum value使用 SDL2 的函数返回错误的枚举值
【发布时间】:2016-02-26 07:04:50
【问题描述】:

我正在使用带有 C++ 的 SDL2。

我开设了一个Player 课程。它包含来自Input 类的对象。

我已经制作了两个 Player 对象。

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

我的“错误”在第 89 行,我在这里调用 m_Controls.keyPressed(SDL_SCANCODE_W)

函数循环通过Input成员数组m_Keys——玩家​​可以按下的键。如果它正在迭代的元素与传递给keyPressed()SDL_Scancode 匹配,则它应该从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() 在我制作 `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

【问题讨论】:

    标签: c++ enums sdl sdl-2


    【解决方案1】:

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

    【讨论】:

    • 恐怕我不明白你的意思。我是 C++ 新手。你能把你的例子显示为代码吗?
    • 公开:输入(){m_PressedKey = CONTROLS_INVALID; } ~Input(){}
    • 或在方法中:控制 keyPressed(SDL_Scancode userInput){ m_PressedKey = CONTROLS_INVALID;std::cout
    猜你喜欢
    • 1970-01-01
    • 2015-10-04
    • 2023-04-10
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多