我正在使用SDL2和C++。使用SDL2返回錯誤枚舉值的函數
我做了一個Player
類。它包含Input
類中的一個對象。
我製作了兩個Player
對象。
在Player
構造Player()
,我請setControls()
上構件Input
對象m_Controls
。然後我在同一個對象上調用keyPressed()
。這兩個功能都屬於Input
。
我的「錯誤」是在行89,我呼籲m_Controls.keyPressed(SDL_SCANCODE_W)
。
函數循環到Input
成員數組m_Keys
- 玩家可以按的鍵。如果迭代的元素匹配SDL_Scancode
傳遞給keyPressed()
,它應該從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_W
是player1
的控件之一,所以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++新手。你能告訴我你的代碼示例嗎? – Username
public: Input(){m_PressedKey = CONTROLS_INVALID; } 〜Input(){} – user5976242
或在該方法中:控制keyPressed(SDL_Scancode userInput){0} {0} {mPressedKey = CONTROLS_INVALID; std :: cout <<「userInput:」<< userInput << std :: endl; – user5976242