(Java) Изменение переменных в экземпляре класса - PullRequest
0 голосов
/ 09 января 2012

Я смотрел на эту проблему весь день, и я не могу понять, что происходит.По сути, у меня есть 2 класса, один - JFrame, а другой - просто игровой цикл.Класс JFrame должен изменять некоторые переменные в зависимости от того, что нажимает пользователь.

Однако при нажатии на кнопку методы не изменяют никакие переменные.Единственный способ изменить переменную в моем JFrame - это вызвать в ней метод из моего вызывающего класса.

Вот пример соответствующего кода.

public class CMBBattle {

public void startCombat (object.PlayerVariables p1Char1, object.PlayerVariables p1Char2, object.PlayerVariables p1Char3){
    boolean status;
    int teamMovesLeft = 0;

    Battle battle = new Battle(p1Char1, p1Char2, p1Char3);

    status = battle.combatStatus();
    teamMovesLeft = battle.getMovesLeft();
    while (status == true){
        teamMovesLeft = battle.getMovesLeft();
        if (teamMovesLeft <= 0){
            battle.createBattleOrder();
            battle.doBattle();
        }
        status = battle.combatStatus();
        if(status == true){
            battle.newRound();
        }
    }
  }

  public class Battle extends JFrame implements MouseListener {
     private String currentCharacter;

   private void characterOrders(String userChoice, String playerHit){
    int playerAttacker = 0;
    int abilityUsed = 0;
    int speedOfHit = 0;
    boolean finished = false;

    //TODO Currently nothing is happening with what you actually used, i think this was in the old code. Re-implement
    //TODO At this point I am going to just say everything is a quick attack.  So, it'll take up 1 per attack.
    //TODO Add logic to see if something is over their move limit or not
    speedOfHit = 1;

    if(currentCharacter.equals(Player1.charName)){
        playerAttacker = 1;
        char1Orders[moveUses][0] = figureDamage(abilityUsed);
        char1Orders[moveUses][1] = playerAttacker;
        char1Orders[moveUses][2] = getCharacterID(playerHit);
        if((currentPlayerMoves - speedOfHit) <= 0){
            player1.ordersFinished = true;
            finished = true;
        }
    }
    else if(currentCharacter.equals(player2.charName)){
        playerAttacker = 2;
        char2Orders[moveUses][0] = figureDamage(abilityUsed);
        char2Orders[moveUses][1] = playerAttacker;
        char2Orders[moveUses][2] = getCharacterID(playerHit);
        if((currentPlayerMoves - speedOfHit) <= 0){
            player2.ordersFinished = true;
            finished = true;
        }
    }
    else if(currentCharacter.equals(player3.charName)){
        playerAttacker = 3;
        char3Orders[moveUses][0] = figureDamage(abilityUsed);
        char3Orders[moveUses][1] = playerAttacker;
        char3Orders[moveUses][2] = getCharacterID(playerHit);
        if((currentPlayerMoves - speedOfHit) <= 0){
            player3.ordersFinished = true;
            finished = true;
        }
    }
    moveUses += 1;

    //The following decides if it's time for the next player or not, if this is the last player,
    //then it's time to set it to zero and let the handler do the rest.
    if(finished == true){
        if(player1.ordersFinished == false){
            currentCharacter = player1.charName;
            currentPlayerMoves = player1.moves;
        }
        else if(player2.ordersFinished == false){
            currentCharacter = player2.charName;
                            //THE PROBLEM IS RIGHT HERE, THE LINE ABOVE SHOULD HAVE
                            //CHANGED CURRENTCHARACTER, BUT IT DID NOT
            currentPlayerMoves = player2.Moves;
        }
        else if(player3.ordersFinished == false){
            currentCharacter = player3.charName;
            currentPlayerMoves = player3.moves;
        }
        else {
            currentCharacter = "";
            currentPlayerMoves = 0;
        }
        moveUses = 0;
    }
    else{
        currentPlayerMoves -= 1;
    }

    /*
    if (actualUses != Character.moves){
        //TODO We should add logic so that an unitilized variable isn't used...
        //If they don't do anything, set the rest of their array to zeroe's so we can later say, if zero exclude them from round or don't worry about the shite
    }
    */
}

   public String setCurrent(){
   currentCharacter = "NewPerson";
    }

    @Override
public void mouseClicked(MouseEvent e) {
    if(!currentCharacter.equals("")){
        String playerHit = JOptionPane.showInputDialog(null, "Who should "                          + currentCharacter + " attack?");
        if(e.getSource() == attackButton){
            characterOrders("Attack", playerHit);
        }
    }
}

}

Теперь, если я вызову setCurrent из моего startCombat метода, переменная изменится.Однако нажатие не меняет переменную.Он прекрасно выполнит код, однако, когда он попадет в ту часть, где он его меняет, он не изменит его.Я уверен, что просто что-то упустил, но я не могу понять правило, которое я просмотрел ...

- ОБНОВЛЕНИЕ - Я обновил CharacterOrders, чтобы отразить мои фактическиекод как он есть сейчас Обратите внимание, что currentCharacter является текущим Character, который издает приказы.

Ответы [ 3 ]

0 голосов
/ 09 января 2012

Хорошо, так как код неполон, и мне трудно его понять, я могу быть совершенно не на этом пути.

Но ... откуда взялась playerHit в вашем слушателе для мыши? Где это устанавливается? Я не уверен, но, возможно, playerHit не соответствует имени любого из игроков, и в результате он не вводит ваш первый набор из трех if-else утверждений, и поэтому finished никогда не true

Если вы можете разместить больше информации или, возможно, сделать код более информативным, мы могли бы получить больше представления о том, в чем заключается ваша проблема. Извините, если это не было решением.

Не является частью решения , но это может сделать код немного чище: в вашем первом наборе if-else операторов в characterOrders, возможно, вы могли бы просто установить некоторую переменную равной char1Orders , char2Orders или char3Orders вместо того, чтобы называть каждого по отдельности? Тогда оперируй вместо переменной?

Так вроде как

if(currentCharacter.equals(Player1.charName)) {
    myVariable = char1Orders;
}
else if(/*...a condition...*/) {
   //...more code
}
//...
myVariable[0] = /*...*/;
//...etc.
0 голосов
/ 11 января 2012

Проблема в том, что я не понимаю темы (которую я сейчас исправил). Поскольку я создавал свой JFrame, а затем надеялся, что он будет работать одновременно с кодом, ему никогда не позволяли выполнять его код, потому что технически он все еще создавался. Итак, обратите внимание на темы, это ответ.

0 голосов
/ 09 января 2012

не должно быть

private void CharacterOrders(String userChoice, String PlayerHit)
{
    currentCharacter = PlayerHit;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...