在处理语言中有一些问题,它说case表达式必须是常量,但我可以发誓它们是。我不知道我在这里做错了什么。有人有提示吗?
int gameState;
static int MENU = 0;
static int GAME = 1;
static int OPTIONS = 2;
void setup() {
screenSizex = 960;
screenSizey = 640;
size(screenSizex, screenSizey);
gameState = MENU;
}
void draw(){
switch(gameState) {
case MENU:
//does menu stuff
break;
case OPTIONS:
//does options stuff
break;
case GAME:
//does game stuff
break;
default:
break;
}
}
void mousePressed() {
if (//over some object) {
gameState = GAME;
}
else if (//over some object) {
gameState = OPTIONS;
}
else if (//over some object) {
exit();
}
}
答案 0 :(得分:8)
static
只是使字段属于类而不是类的实例。静态字段可以随时修改,因此它不是常量。如果您希望将字段视为常量值,则需要创建字段final
:
static final int MENU = 0;
static final int GAME = 1;
static final int OPTIONS = 2;
将字段标记为static final
意味着它们都存在于类级别(它们不属于该类的任何特定实例,您也不需要实例来访问这些值)并且不能初始化后修改(有效地使值保持不变)。
但是,我认为这对你来说真的是一个使用enumeration type的好地方。以下是我如何更改游戏状态声明:
GameState gameState;
enum GameState {
MENU, GAME, OPTIONS
}
以下是您需要做的其他代码才能使用该代码:
void setup() {
screenSizex = 960;
screenSizey = 640;
size(screenSizex, screenSizey);
gameState = GameState.MENU;
}
void draw(){
switch(gameState) {
case MENU:
//does menu stuff
break;
case OPTIONS:
//does options stuff
break;
case GAME:
//does game stuff
break;
default:
break;
}
}
void mousePressed() {
if (/*over some object*/) {
gameState = GameState.GAME;
}
else if (/*over some object*/) {
gameState = GameState.OPTIONS;
}
else if (/*over some object*/) {
exit();
}
}
基本上,我必须更改的是在GameState.
,MENU
和GAME
的所有出现之前添加符合条件的OPTION
,但不包括case
语句,因为编译器可以根据GameState
中使用的表达式的类型推断出这些是switch
的值。使用enum
代替int
具有额外的优势,即它将gameState
的值仅限制为3个有效值,而不是整个整数范围。