我正在制作一款简单的格斗游戏。有两个对立的球员,他们的目标是消灭另一个;我创造了健康酒吧等。为了对对手发动攻击,用户点击某个按钮“攻击”。如果一个玩家的健康栏已达到零,我希望禁用此按钮。
frame http://sstatic.net/stackoverflow/img/Untitled.jpg
我的程序结构:
主类(公共类App扩展JFrame) //私人JButtons,JPanels等
公共应用() //所有组件和已注册侦听器的布局
主要方法 // frame / s(我的主方法中有多个框架。哈哈)
监听器类/ es // if else语句(if(e.getSource == xyz))
绘制健康栏的JPanel类/ es
----结构结束
这是我到目前为止在面板类上所做的事情(总源代码是一个800行的txt文件):
class HP2panel extends JPanel {
public void damageTake() {
if (widthHP <= 0) {
damageToMe = 0;
}
else if (widthRage >= 250) {
damageToMe = 175 + (int)(Math.random() * 25);
}
else if (widthHP > 0 && widthRage < 250) {
damageToMe = Math.round(1 + (int)(Math.random() * 15));
}
if (widthHP2 <= 0) {
damageToMe = 0;
}
widthHP2 = widthHP2 - damageToMe;
logtxt.append("\nYour HP: " + widthHP2);
logtxt.append("\nDamage you've taken: " + damageToMe);
repaint();
}
public void healdamageTake() {
if (widthHP2 <= 0) {
Heal = 0;
}
if (widthHP2 >= 250) {
Heal = 0;
}
else {
Heal = (int)(Math.random() * 25);
}
widthHP2 = widthHP2 + Heal;
logtxt.append("\n");
logtxt.append("\nHealed HP: " + Heal);
repaint();
}
public void restartHP2() {
widthHP2 = 250;
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.green);
g.fillRect(0, 0, widthHP2, 16);
}
}
HP2panel是面板类,其中绘制了播放器2的运行状况栏(fillRect)。 widthHP,widthRage是我制作的其他小组类的参数。
我想在widthHP为零或小于时禁用攻击按钮。 我曾经在if语句上工作,但似乎没用。
我不知道我是否会将它放在我的Listener类或我的代码中的任何其他位置。
答案 0 :(得分:4)
我认为关键是使用 Observer Design Pattern 来允许一个对象侦听另一个对象中的状态更改。
我假设每个Player类都有一个健康字段。我通过给予Player类一个私有的SwingPropertyChangeSupport字段,通过给出Player类addPropertyChangeListener
和removePropertyChangeListener
方法,并通过调用{{1}通知您的听众健康变化,使其成为“绑定”属性每当在firePropertyChange(...)
方法内更改健康属性时,方法。这样,任何需要监听健康变化(或Player类的任何其他绑定属性)的类都可以这样做,并且可以根据需要响应这些更改。这是类字段/属性应该是私有的并且只能通过setter方法更改的另一个原因。
例如:
setHealth(...)
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.*;
import javax.swing.event.*;
public class PropChangeEg {
private static void createAndShowGui() {
JFrame frame = new JFrame("Prop Change Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new PlayerPanel(new Player("Pete")));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class Player {
public static final String HEALTH = "health";
private SwingPropertyChangeSupport propChangeSupport =
new SwingPropertyChangeSupport(this);
private String name;
private int health = 100;
public Player(String name) {
this.name = name;
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
propChangeSupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
propChangeSupport.removePropertyChangeListener(listener);
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
int oldValue = this.health;
int newValue = health;
this.health = health;
propChangeSupport.firePropertyChange(HEALTH, oldValue, newValue);
}
public String getName() {
return name;
}
}
这将导致JButton响应玩家健康状况所持有的值。例如,以下是来自此GUI的两个屏幕,一个具有正的非零健康值,另一个具有Player的健康值为零: