我是Java的新手,我在代码中遇到了一个“错误”,我无法理解/修复。为了给你一些背景知识,我设置了一个说明所有游戏状态的枚举(下图)
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
方法中指定将GameState设置为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);
}
换句话说,我试图检测GameState是否为IN_LOBBY
,如果是这样,那么玩家就不能打破阻挡。但目前出现了两个问题。
由于某些原因,当GameState为IN_LOBBY
时,该插件甚至不会引起注意。它只是忽略了if语句。它甚至不会发送消息,就像游戏状态不是IN_LOBBY
一样。
我不确定如何根据玩家破坏的块来动态更改材料。
答案 0 :(得分: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;
}