2014-03-29 350 views
2

在处理语言中有一些问题,它说表达式必须是常量,但我可以发誓他们是。我不知道我在这里做错了什么。任何人都有一些提示?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(); 
    } 
} 

回答

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(); 
    } 
} 

基本上所有我有到变化在MENUGAMEOPTION所有出现的前面添加一个合格GameState.,随着case陈述的那些之外,因为编译器可以推断,这些是基于所使用的表达式的类型的GameStateswitch。使用enum而不是int具有的附加优点是,它将gameState的值限制为只有3个有效值,而不是整个整数范围。