2017-07-17 62 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

相关问题