0

我正在制作一个具有主类、战斗类、怪物类、玩家类等的 Java 游戏……我在主类框架上显示了统计信息。按下按钮会创建一个新的战斗框架,其中还会显示统计数据。战斗结束后,统计数据有所不同(例如,玩家的生命值低于被怪物击中前的值)。我需要这些统计数据的变化在战斗框架消失后反映在主框架上。

告诉主要班级战斗结束并刷新统计数据的最佳方式是什么?代码如下。显然,这是一项正在进行的工作,还有一些其他不相关的类。

开始战斗的主类的一部分(即,创建一个新的战斗对象,它是一个 JFrame):

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);
        }
        ...
}

战斗课的部分:

...


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();
            }
        }
        ...
}

编辑:试图在这里简化代码,以便更清楚我在问什么。

4

2 回答 2

0

为什么不在主类中创建一个方法:

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

然后,在您的 Battle 类中,当战斗完成时,您只需调用该方法。另外,我认为您可能会发现在您的项目中实现单例模式很有用,因为听起来好像始终只有一个战斗课程。

你可能还想把所有的战斗逻辑放到一个类中。我得到的最好的编程建议是将逻辑与 GUI 分开。

或者,您可能只想忽略我所说的一切,因为我只有 13 岁,而且我使用 C# 编程,而不是 Java。

于 2012-12-04T01:12:40.813 回答
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);
       }
    }
于 2012-12-04T01:35:54.360 回答