gpt4 book ai didi

java - 当某个变量为零时禁用按钮? [解决: Observer Design Pattern]

转载 作者:行者123 更新时间:2023-11-29 03:29:05 29 4
gpt4 key购买 nike

我正在制作一款简单的格斗游戏。有两个对立的玩家,他们的目标是消灭对方;我创建了健康栏等。要对对手发起攻击,用户单击某个按钮“攻击”。如果一名玩家的健康栏已达到零,我希望禁用此按钮。

frame http://sstatic.net/stackoverflow/img/Untitled.jpg

我的程序结构:

主类(公共(public)类 App 扩展 JFrame)//私有(private) JButtons、JPanels 等

公共(public)应用程序() //所有组件和注册监听器的布局

主要方法 //frame/s(我的main方法里不止一帧,哈哈)

监听类//if else 语句 (if (e.getSource == xyz))

绘制健康条的 JPanel 类

----结构结束

这是我到目前为止在面板类上所做的(总源代码是一个 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 的 healthbar(fillRect) 的面板类。 widthHP、widthRage 是我制作的其他面板类的参数。

我希望 widthHP 变为零或小于时禁用攻击按钮。我研究过 if 语句,但它似乎没用。

我不知道我是要把它放在我的 Listener 类中还是我代码中的其他地方。

最佳答案

我认为关键是使用 Observer Design Pattern 允许一个对象监听另一个对象的状态变化。

我假设每个 Player 类都有一个 health 字段。我会通过为 Player 类提供一个私有(private) SwingPropertyChangeSupport 字段,通过为 Player 类提供 addPropertyChangeListenerremovePropertyChangeListener 方法,并通过通知您的听众健康状况来使其成为“绑定(bind)”属性每当在其 setHealth(...) 方法中更改健康属性时,通过调用 firePropertyChange(...) 方法来更改。这样,任何需要监听健康变化(或 Player 类的任何其他绑定(bind)属性)的类都可以这样做,并且可以根据需要响应这些变化。这是类字段/属性应该是私有(private)的并且只能通过 setter 方法更改的另一个原因。

例如:

驱动类,PropChangeEg.java

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

Player.java 类

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

}

PlayerPanel.java类

@SuppressWarnings("serial")
class PlayerPanel extends JPanel {
private Player player;
private JButton fireButton = new JButton("Fire");
private JSlider healthSlider;

public PlayerPanel(final Player player) {
this.player = player;
setBorder(BorderFactory.createTitledBorder("Player: " +
player.getName()));

healthSlider = new JSlider(0, 100, player.getHealth());
healthSlider.setBorder(BorderFactory.createTitledBorder("Health"));
healthSlider.setPaintLabels(true);
healthSlider.setPaintTicks(true);
healthSlider.setPaintTicks(true);
healthSlider.setMajorTickSpacing(20);
healthSlider.setMinorTickSpacing(5);

add(healthSlider);
add(fireButton);

healthSlider.addChangeListener(new ChangeListener() {

@Override
public void stateChanged(ChangeEvent evt) {
player.setHealth(healthSlider.getValue());
}
});

player.addPropertyChangeListener(new PropertyChangeListener() {

@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(Player.HEALTH)) {
fireButton.setEnabled(player.getHealth() > 0);
}
}
});

}

public Player getPlayer() {
return player;
}

}

这将生成一个 JButton,它响应 Player 的生命值。例如,这是此 GUI 的两个屏幕,一个具有正的非零健康值,另一个是 Player 的健康值为零:

enter image description here

关于java - 当某个变量为零时禁用按钮? [解决: Observer Design Pattern],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19334935/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com