2012-12-04 39 views
0

我正在製作一個主類,一個戰鬥類,一個怪物類,一個玩家類等的Java遊戲......我的統計數據顯示在main類框架。按下按鈕會創建一個新的戰鬥框架,並顯示統計數據。戰鬥結束後,統計數據會有所不同(例如,玩家的生命值比被怪物擊中前低)。戰鬥幀消失後,我需要將這些統計數據的變化反映回主框架。Java初學者:讓一個班級知道另一個班級已經完成

告訴主要班級戰鬥結束並刷新統計數據的最佳方式是什麼?代碼如下。顯然這是一項正在進行的工作,還有其他一些不相關的課程。

啓動一個戰鬥主類的

部分(即,創建一個新的戰鬥對象,它是一個JFrame):

... 


public class BattleFrame extends JFrame implements ActionListener 
{ 
    Monster newMonster = new Monster(); 
    ... 
    public BattleFrame() 
    ... 
    public void displayStats() 
    { 
     monsterLabel.setText("<html>Type: " + newMonster.getMonsterName() 
       + "<br>Health: " + newMonster.getHealth() 
       + "<br>Attack: " + newMonster.getAttackName() 
       + "<br>Attack Damage: " + newMonster.getAttackDamage()); 
     playerLabel.setText("<html>Player: " + DarkWorld.user.getPlayerName() 
       + "<br>Health: " + DarkWorld.user.getHealth() 
       + "<br>Attack Damage: " + DarkWorld.user.getAttackDamage() 
       + "<br>Level: " + DarkWorld.user.getLevel() 
       + "<br>Experience: " + DarkWorld.user.getExperience()); 
    } 
    ... 
      if(newMonster.getHealth() <= 0) 
      { 
       ... 
       JOptionPane.showMessageDialog(null, "You killed the monster! You found a " + newItem.getItemName() 
         + ". It has been added to your inventory."); 
       dispose(); 
      } 
      if(DarkWorld.user.getHealth() <= 0) 
      { 
       //if player dies (health reaches zero), the game is over - need to make game end 
       displayStats(); 
       JOptionPane.showMessageDialog(null, "The monster killed you!"); 
       dispose(); 
      } 
     } 
     ... 
} 

編輯::

public class DarkWorld extends JFrame implements ActionListener 
{ 
    ... 
    public DarkWorld() 
    { 
     ... 
    public void createInfoLabel() 
    { 
     infoLabel.setText("<html>Player: " + DarkWorld.user.getPlayerName() 
      + "<br>Health: " + DarkWorld.user.getHealth() 
      + "<br>Attack Damage: " + DarkWorld.user.getAttackDamage() 
      + "<br>Level: " + DarkWorld.user.getLevel() 
      + "<br>Experience: " + DarkWorld.user.getExperience()); 
    } 
    ... 
     if(source == monsterButton) 
     { 

      BattleFrame battle = new BattleFrame(); 
      final int WIDTH = 700; 
      final int HEIGHT = 500; 
      battle.setSize(WIDTH, HEIGHT); 
      battle.setVisible(true); 
     } 
     ... 
} 

對戰類的部分試過簡化這裏的代碼,以便更清楚我在問什麼。

+1

上課沒有完成! – Juvanis

+0

我懷疑這是一個術語問題,但ivaonic是正確的。你的意思是「主要」功能嗎?在這種情況下,程序在結束時結束,並且沒有什麼可以做的。 – ApproachingDarknessFish

+0

我不確定你的意思,對不起。主要班級應該在整個過程中堅持下來,每當按下按鈕時就會打電話給戰鬥班。 – Jeremy

回答

0

爲什麼你不只是在你的主類中創建一個方法:

public void updateStats() { /*update the stats*/ } 

然後,在你的戰鬥類,當戰鬥完成後,你只需要調用該方法。另外,我認爲你可能會發現在你的項目中實現Singleton模式很有用,因爲聽起來在任何時候都只有一個戰鬥類。

你可能也想把所有的戰鬥邏輯放到一個類中。我得到的最好的編程建議是從GUI分離邏輯。

或者,你可能只是想忽略我所說過的所有事情,因爲我只有13歲,而且我用C#編程,而不是Java。

+0

好的,那麼你是不是說要在主戰場內調用這個方法來創造一個新的戰鬥目標,然後在戰鬥結束後再次從戰鬥類中調用同樣的方法? 另外,也許我不完全理解我自己的代碼。在我看來,有戰鬥對象的數量與戰鬥開始的次數一樣多,每次按下按鈕時都會有新的戰鬥對象出現,但每次只有一次。換句話說,dispose()方法不會消除戰鬥對象嗎? – Jeremy

+0

現在我已經簡化了你的代碼,現在我明白你的代碼了。 – Jutanium

+0

由於一次只有一個戰鬥等級,所以你可以使用單體模式來進入那一個戰鬥等級。 Singleton類會有一個名爲resetBattle()的方法,每當戰鬥結束時都會調用它。 – Jutanium

0

我可以建議你不要這樣做,而是讓統計顯示屏聽取主要玩家對象的 。當主玩家對象有其中一個屬性被更改爲 時,統計屏幕可以自行更新。

... 
import java.beans.PropertyChangeListener; 
import java.beans.PropertyChangeEvent; 
... 

public class User { 

    private List<PropertyChangeListener> propertyListeners; 

    ... add, and remove listener methods ...   


    public void setHitPoints(int newValue){ 
     PropertyChangeEvent event = new PropertyChangeEvent(this, "hitPoints", myHitpoints, newValue); 
     myHitpoints = newValue; 
     for (PropertyChangeListener listener : propertyListeners){ 
      listener.propertyChange(event); 
     } 
    } 
+0

謝謝,我會嘗試。 – Jeremy

+0

噢,是的,這是一個更好的解決方案。 – Jutanium

+0

Eclipse在此行上給我一個錯誤: 'Private List propertyListeners;' 錯誤提示「PropertyChangeListener無法解析爲某個類型」。我之前沒有使用過PropertyChangeListener或PropertyChangeEvent。我需要創建這些東西才能使用嗎?感謝您的反饋。 – Jeremy

相關問題