为什么 if 语句检测不到我的游戏状态
Why won't the if statement detect my game state
我是 Java 的新手,我在我的代码中遇到 "bug" 遇到问题 understanding/fixing。为了给你一些背景知识,我设置了一个枚举来说明所有游戏状态(如下)
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
class 中,我在 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
.
我不确定如何根据玩家破坏的方块动态更改 material。
你的setter是错误的:
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();
}
此方法递归调用自身,没有任何结束条件。因此,如果您尝试调用它,您将得到一个 WhosebugException。
相反,您可能打算 return canJoin 字段:
public boolean canJoin() {
return canJoin;
}
我是 Java 的新手,我在我的代码中遇到 "bug" 遇到问题 understanding/fixing。为了给你一些背景知识,我设置了一个枚举来说明所有游戏状态(如下)
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
class 中,我在 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
.我不确定如何根据玩家破坏的方块动态更改 material。
你的setter是错误的:
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();
}
此方法递归调用自身,没有任何结束条件。因此,如果您尝试调用它,您将得到一个 WhosebugException。
相反,您可能打算 return canJoin 字段:
public boolean canJoin() {
return canJoin;
}