2012-01-09 47 views
0

我一直在看這個問題,我似乎無法理解發生了什麼。基本上,我有兩個班,一個是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已經被執行了? – 2012-01-09 00:29:00

+0

setCurrent如何工作?它沒有pativehesis,編譯器不應該允許。另外,目前的角色是否應該是另一個團隊的角色? – davogotland 2012-01-09 00:32:38

+0

這是我的不好,我寫在這裏,但這不是一個直接的複製和粘貼。我將使用實際的複製和粘貼來更新信息 – 2012-01-09 00:36:48

回答

0

它不應該是

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

是的,它是在實際的代碼中。但是,我只是想給出一些關於代碼的概念。我身邊的代碼正在工作我猜想問題是我無法更改CharacterOrders中的currentCharacter。 – 2012-01-09 00:35:32

+0

那你爲什麼發佈它是'currentCharacter = userChoice;'? – davogotland 2012-01-09 00:37:05

0

好吧,因爲代碼是不完整的,我發現它有點難以遵循,我可能是完全在錯誤的軌道在這裏。

但是...... playerHit在你的監聽器中來自哪裏mouseClicked?它在哪裏設置?我不確定,但也許playerHit不對應任何球員的名字,因此,它不會輸入您的第一組三個if-else報表,因此finished從不是true

如果您可以發佈更多信息,或者讓代碼更具信息性,我們可能會對您的問題有更多的瞭解。對不起,如果這不是解決方案。

不是解決一部分,但它可能使代碼有點清潔:在你的第一套在characterOrdersif-else語句,也許你可以只設置一些變量是任char1Orderschar2Orderschar3Orders而不必調用每一個單獨?然後對變量進行操作?

所以還挺喜歡

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

我之前在代碼中,並且因爲一些複雜而不得不將其更改爲此。然而,這個問題實際上並不是實際的流程。它流動的方式是我想要的,我可以告訴這個,因爲我在eclipse中調試它。但是,當它到達我試圖更改currentCharacter變量的部分時,代碼實際上並沒有改變它,但它確實運行了該行代碼。 – 2012-01-09 01:43:31

+0

啊,代碼實際上在運行?好的。嗯......好吧,如果這些數值都是截然不同的,而且它們都是不同的物體,那麼這就更難以弄清楚了。我現在唯一能想到的就是它們可能不是獨特的價值。除此之外,呃...我什麼都沒有...抱歉... = \ – blahman 2012-01-09 02:17:05

+0

哈哈沒關係。我認爲問題是A.我需要重新閱讀有關靜態和非靜態方法/變量,或B.因爲主類正在循環運行,也許這阻止了我的jframe運行。 – 2012-01-09 02:22:15

0

的問題是我缺乏線程的理解(我現在已經糾正)的。由於我正在創建我的JFrame,然後希望它能夠與代碼同時運行,所以從未允許執行它的代碼,因爲從技術上講,它仍在創建中。所以,注意線程就是答案。

相關問題