2017-07-17 1 views
1

Je suis nouveau sur Java et j'ai rencontré un "bug" dans mon code que j'ai de la difficulté à comprendre/corriger. Pour vous donner quelques connaissances de base, je mis en place un Enum qui indique tous les états de jeu (ci-dessous)Pourquoi l'instruction if ne détectera-t-elle pas mon état de jeu?

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; 
    } 
} 

Dans ma classe main.java je précise dans la méthode onEnable pour définir le GameState à IN_LOBBY.

En fait ce que je suis en train de faire est dans un BlockBreakEvent Listener je veux dire est

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); 
} 

Autrement dit, je suis en train de détecter si le GameState est IN_LOBBY et si oui faire en sorte que les joueurs peuvent ne pas casser les blocs. Mais actuellement, deux problèmes sont apparus.

  1. Pour une raison quelconque lorsque le GameState est IN_LOBBY le plug-in ne prendra même avis. Il ignore simplement cette déclaration si. Il n'enverra même pas le message, comme si le gamestate n'était pas IN_LOBBY. Je ne suis pas sûr de savoir comment changer dynamiquement le matériau en fonction du bloc que le joueur a cassé.

Répondre

5

Votre setter est erroné:

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

Vous créez une nouvelle currentState variable locale ici, au lieu d'utiliser le champ existant. Cela se produit parce que vous avez écrit le type de variable devant, créant une nouvelle déclaration d'initialisation.

utiliser:

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

(Depuis currentState est un champ statique GameState.currentState = state; fonctionne également dans ce cas)

Edit:

Un autre problème est avec votre méthode de canJoin.

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

Cette méthode s'appelle récurremment sans aucune condition de fin. Vous obtiendrez donc une exception StackOverflowException si vous essayez de l'appeler.

Au lieu de cela que vous vouliez dire probablement retourner le champ canJoin:

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

mentionnent également la même chose pour sa méthode isState, il doit utiliser currentState retour == Etat –

+1

@RAZ_Muh_Taz: Son champ currentState est statique. Donc, se référant à cela par GameState.currentState devrait ne causer aucun problème. Bien sûr, la question de savoir si l'état actuel est sauvegardé dans un champ statique est une autre question, mais je pense que cela irait au-delà de cette question. –

+0

Merci! Est-ce que vous savez par hasard comment faire en sorte que lorsque le joueur casse un bloc, il le remplace? Évidemment, je le fais mal. – joeldesante