使用 SDL2 的函数返回错误的枚举值
Function using SDL2 returning wrong enum value
我在 C++ 中使用 SDL2。
我做了一个Player
class。它包含来自 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_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
?
在ctor或keyPressed方法中初始化它; m_PressedKey = CONTROLS_INVALID;默认的 ctors 是邪恶的:)
我在 C++ 中使用 SDL2。
我做了一个Player
class。它包含来自 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_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
?
在ctor或keyPressed方法中初始化它; m_PressedKey = CONTROLS_INVALID;默认的 ctors 是邪恶的:)