簡體   English   中英

(Java)更改類實例中的變量

[英](Java) Changing variables in a instance of a class

我整天都在研究這個問題,但似乎無法理解發生了什么。 基本上,我有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);
        }
    }
}

}

現在,如果我從startCombat方法調用setCurrent ,則變量將更改。 但是,單擊不會更改變量。 它將很好地運行代碼,但是當它到達更改它的部分時,它不會更改。 我確定我只是想念一些東西,但我無法弄清楚我所看的規則...

-更新-我更新了CharacterOrders以反映我現在的實際代碼,請注意, currentCharacter是發布訂單的當前Character

不應該

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

好的,由於代碼不完整,並且我發現很難遵循,因此我在這里可能完全走錯了路。

但是... playerHit來自於您的監聽器中的mouseClicked的哪里? 在哪里設置? 我不確定,但是playerHit可能與任何玩家的名字都不對應,因此,它沒有輸入您的第一組三個if-else語句,所以finished永遠不是true嗎?

如果您可以發布更多信息,或者使代碼更具參考價值,我們也許可以對您的問題有更多的了解。 抱歉,這不是解決方案。

不是解決方案的一部分,但是它可能會使代碼更清晰:在characterOrders第一組if-else語句中,也許您可​​以將一些變量設置為char1Orderschar2Orderschar3Orders而不必分別調用每個變量? 然后對變量進行運算?

有點像

if(currentCharacter.equals(Player1.charName)) {
    myVariable = char1Orders;
}
else if(/*...a condition...*/) {
   //...more code
}
//...
myVariable[0] = /*...*/;
//...etc.

問題是我對線程的了解不足(現在已經糾正了)。 由於我正在創建我的JFrame,然后希望它與代碼並發運行,因此從技術上講,它仍然在創建中,因此它從未被允許執行。 所以,注意線程就是答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM