- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一款简单的格斗游戏。有两个对立的玩家,他们的目标是消灭对方;我创建了健康栏等。要对对手发起攻击,用户单击某个按钮“攻击”。如果一名玩家的健康栏已达到零,我希望禁用此按钮。
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 类提供 addPropertyChangeListener
和 removePropertyChangeListener
方法,并通过通知您的听众健康状况来使其成为“绑定(bind)”属性每当在其 setHealth(...)
方法中更改健康属性时,通过调用 firePropertyChange(...)
方法来更改。这样,任何需要监听健康变化(或 Player 类的任何其他绑定(bind)属性)的类都可以这样做,并且可以根据需要响应这些变化。这是类字段/属性应该是私有(private)的并且只能通过 setter 方法更改的另一个原因。
例如:
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;
}
}
@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 的健康值为零:
关于java - 当某个变量为零时禁用按钮? [解决: Observer Design Pattern],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19334935/
@Cacheable在同一类中方法调用无效 上述图片中,同一个类中genLiveBullets()方法调用同类中的queryLiveByRoom()方法,这样即便标识了Cacheable标签,
目录 @Transaction注解导致动态切换更改数据库失效 使用场景 遇到问题 解决 @Transaction
@RequestBody不能class类型匹配 在首次第一次尝试使用@RequestBody注解 开始加载字符串使用post提交(貌似只能post),加Json数据格式传输的时候,
目录 @Autowired注入static接口问题 @Autowired自动注入普通service很方便 但是如果注入static修饰的serv
目录 @RequestBody部分属性丢失 问题描述 JavaBean实现 Controller实现
目录 解决@PathVariable参数接收不完整的问题 今天遇到的问题是: 解决办法: @PathVariable接受的参
这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚。后来终于找到了原因。 如果你也出现了这种情况,可以从下面开始排查。 1、特性 先来了解一下@Trans
概述: ? 1
场景: 在处理定时任务时,由于这几个方法都是静态方法,在aop的切面中使用@Around注解,进行监控方法调用是否有异常。 发现aop没有生效。 代码如下:
最近做项目的时候 用户提出要上传大图片 一张图片有可能十几兆 本来用的第三方的上传控件 有限制图片上传大小的设置 以前设置的是2M&nb
我已经实现了这个SCIM reference code在我们的应用程序中。 我实现的代码确实通过了此postman link中存在的所有用户测试集合。 。我的 SCIM Api 也被 Azure 接受
我一直对“然后”不被等待的行为感到困扰,我明白其原因。然而,我仍然需要绕过它。这是我的用例。 doWork(family) { return doWork1(family)
我正在尝试查找 channel 中的消息是否仍然存在,但是,我不确定如何解决 promise ,查看其他答案和文档,我可以看到它可能是通过函数实现的,但我是不完全确定如何去做。我希望能在这方面获得一些
我有以下情况: 同一工作区中的 2 个 Eclipse 项目:Apa 和 Bepa(为简洁起见,使用化名)。 Apa 项目引用(包括)Bepa 项目。 我在 Bepa 有一个类 X,具有公共(publ
这个问题已经有答案了: Why am I getting a NoClassDefFoundError in Java? (31 个回答) 已关闭 6 年前。 我正在努力学习 spring。所以我输入
我正在写一个小游戏,屏幕上有许多圆圈在移动。 我在两个线程中管理圈子,如下所示: public void run() { int stepCount = 0; int dx;
我在使用 Sympy 求解方程时遇到问题。当我运行代码时,例如: 打印(校正(10)) 我希望它打印一个数字 f。相反,它给我错误:执行中止。 def correction(r): from
好吧,我制作的每个页面都有这个问题。我不确定我做错了什么,但我所有的页面都不适用于所有分辨率。可能是因为我使用的是宽屏?大声笑我不确定,但在小于宽屏分辨率的情况下,它永远不会看起来正确。它的某些部分你
我正在尝试像这样进行一个非常简单的文化 srting 检查 if(culture.ToUpper() == "ES-ES" || "IT-IT") { //do something } else
Closed. This question is off-topic. It is not currently accepting answers. Learn more。 想改进这个问题吗?Upda
我是一名优秀的程序员,十分优秀!