2012-01-09 5 views
0

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

Однако при нажатии на кнопку методы не меняют никаких переменных. Единственный способ изменить переменную в моем 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 метода, переменных изменений. Однако щелчок не изменяет переменную. Он отлично выполнит код, однако, когда он попадет в ту часть, где он изменит ее, он не изменит ее. Я уверен, что я просто что-то пропустил, но я не могу понять, какое правило я уже смотрел ...

--UPDATE-- Я обновил CharacterOrders, чтобы отразить мой фактический код, поскольку он прямо сейчас Обратите внимание: currentCharacter является текущим Character, который выдает распоряжения.

+0

Как вы узнали, что задание в CharacterOrders выполнено? Как вы знаете, что CharacterOrders был выполнен вообще? –

+0

как может setCurrent работать? он не имеет парадельтации, компилятор не должен этого допускать. также, является ли текущий персонаж персонажем другой команды, которая является целью? – davogotland

+0

Это мое плохое, я написал это здесь, но это не прямая копия и вставка. Я обновляю информацию с фактической копией и вставкой –

ответ

0

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

private void CharacterOrders(String userChoice, String PlayerHit) 
{ 
    currentCharacter = PlayerHit; 
} 
+0

Да, это действительно код. Тем не менее, я пытался просто дать общее представление о том, что делает код. Код на моей стороне работает, я думаю, проблема заключается в том, что я не могу изменить currentCharacter в CharacterOrders. –

+0

, то почему вы отправили сообщение, что это 'currentCharacter = userChoice;'? – davogotland

0

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

Но ... где сделал playerHit пришло из вашего слушателя для mouseClick? Где он установлен? Я не уверен, но, возможно, 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

Я был в коде, и мне пришлось изменить его на это из-за некоторых осложнений. Однако проблема действительно не какая-либо из фактических потоков. Он течет, как я хочу, и могу сказать это, потому что я отлаживаю его в eclipse. Однако, когда он попадает в ту часть, где я пытаюсь изменить переменную currentCharacter, код фактически не меняет ее, однако она запускает эту строку кода. –

+0

А, код действительно работает? Хорошо. Хм ... ну, если все значения различны, и все они разные объекты, то это несколько сложнее понять. Единственное, о чем я могу думать в данный момент, это то, что они могут не отличаться друг от друга. Кроме этого, ну ... У меня ничего нет ... извините ... = \ – blahman

+0

ха-ха, все в порядке. Я думаю, что проблема заключается в A. Мне нужно перечитать статические и нестатические методы/переменные или B. Поскольку основной класс работает в цикле, возможно, это блокирует запуск jframe. –

0

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