2014-03-29 120 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個有效值,而不是整個整數範圍。