2012-12-04 36 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

相关问题