2017-07-17 65 views
1

我是Java新手,遇到我的代碼中有一個「錯誤」,我無法理解/修復。給你一些背景知識,我成立了,指出所有的遊戲狀態(如下圖)枚舉爲什麼if語句不能檢測到我的遊戲狀態

public enum GameState { 

    IN_LOBBY(true), IN_GAME(false), POST_GAME(false), RESETTING(false); 

    private boolean canJoin;  
    private static GameState currentState; 

    GameState(boolean canJoin) { 
     this.canJoin = canJoin; 
    } 

    public boolean canJoin() { 
     return canJoin(); 
    } 

    public static void setState(GameState state) { 
     GameState currentState = state; 
    } 

    public static boolean isState(GameState state) { 
     return GameState.currentState == state; 
    } 

    public static GameState getState() { 
     return currentState; 
    } 
} 

在我main.java類我在onEnable方法將遊戲狀態設置爲IN_LOBBY指定。

基本上我所要做的是在BlockBreakEvent監聽我想說的是

if (GameState.isState(GameState.IN_LOBBY)) { 
    Location bLoc = block.getLocation(); 
    ChatUtilties.errorPlayer("You may not break blocks at this time.", player); 
    bLoc.getBlock().setType(Material.type); 
} 

換句話說我想檢測,如果遊戲狀態是IN_LOBBY如果是的話讓這個玩家可以不會破壞塊。但是目前出現了兩個問題。

  1. 出於某種原因,當遊戲狀態是IN_LOBBY插件甚至不會採取通知。它只是忽略瞭如果陳述。它甚至不會發送消息,就好像遊戲狀態不是IN_LOBBY

  2. 我不知道如何動態地改變根據玩家爆出什麼塊的材料。

回答

5

你的二傳手是錯誤的:

public static void setState(GameState state) { 
    GameState currentState = state; 
} 

您在這裏創建一個新的局部變量currentState,而不是使用現有的領域。發生這種情況是因爲您在其前面編寫了變量類型,從而創建了一個新的初始化語句。

而是使用:

public static void setState(GameState state) { 
    currentState = state; 
} 

(因爲currentState是一個靜態字段GameState.currentState = state;也將在這種情況下工作)

編輯:

的另一個問題是與你的canJoin方法。

public boolean canJoin() { 
    return canJoin(); 
} 

此方法在沒有任何結束條件的情況下自動調用自身。所以如果你試圖調用它,你會得到一個StackOverflowException。

相反,你可能是指返回canJoin領域:

public boolean canJoin() { 
    return canJoin; 
} 
+1

也提到同樣的事情,他isState方法,他應該用回currentState ==狀態 –

+1

@RAZ_Muh_Taz:他currentState場是靜態的。所以通過'GameState.currentState'引用它應該不會造成問題。當然,將現狀保存在一個靜態領域是一個很好的設計問題是另一個問題,但我覺得這樣做會超出這個問題範圍。 –

+0

謝謝!你有沒有機會知道如何做到這一點,以便當玩家破壞一個區塊時將其替換回來?顯然,我做錯了。 – joeldesante

相關問題