2D 图形问题 - 可能是逻辑
2D Graphics issue - Probably Logic
试图在我的播放器上方制作一个健康栏(使用 2d 图形),但我遇到了问题。
我确定我给出的是 int 而不是 double。
f 是我的 JFrame。
f.board 是一个 JLabel 数组 (17x17),这是我的游戏板
p getHealth returns 100
p getHealthTotal returns 200
您看到的 50 代表健康栏应该有多大
void paint() {
f.glass = new JPanel() {
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.drawImage(img, f.board[p.getY()][p.getX()].getX() - 28, f.board[p.getY()][p.getX()].getY() - 20,
null);
g2d.setColor(Color.BLACK);
g2d.drawRoundRect(f.board[p.getY()][p.getX()].getX() + 5, f.board[p.getY()][p.getX()].getY() - 35,
50, 10, 5, 5);
g2d.setColor(healthColor);
g2d.fillRoundRect(f.board[p.getY()][p.getX()].getX() + 5,f.board[p.getY()][p.getX()].getY() - 35,
(p.getHealth() / p.getHealthTotal()) * 50, 10,5,5);
g2d.setColor(damageColor);
g2d.fillRoundRect(f.board[p.getY()][p.getX()].getX() + 5 + (p.getHealth() / p.getHealthTotal()) * 50,
f.board[p.getY()][p.getX()].getY() - 35, 50 - ( p.getHealth() / p.getHealthTotal()) * 50,
10, 5, 5);
/*g2d.setColor(Color.BLACK);
g2d.drawRoundRect(f.board[p.getY()][p.getX()].getX() + 10, f.board[p.getY()][p.getX()].getY() - 25, 40, 5, 5, 5);
g2d.setColor(expColor);
g2d.fillRoundRect(f.board[p.getY()][p.getX()].getX() + 10, f.board[p.getY()][p.getX()].getY() - 25, p.getExp() / 100 * 40, 5, 5, 5);
/*g2d.setColor(expBorder);
g2d.drawRoundRect(740, 10, 100, 40, 5, 5);
g2d.setColor(expColor);
g2d.fillRoundRect(740, 10, p.getExp(), 40, 5, 5);
g2d.setColor(healthBorder);
g2d.drawRoundRect(610, 10, 100, 40, 5, 5);
g2d.setColor(healthColor);
g2d.fillRoundRect(610, 10, p.getHealth() / p.getHealthTotal() * 100, 40, 5, 5);
p.ge*/
g2d.drawImage(Toolkit.getDefaultToolkit().getImage("src/BossBattles/Images/Settings.png"), 925, 15, null);
}
};
f.glass.setOpaque(false);
f.setGlassPane(f.glass);
f.glass.setVisible(true);
f.glass.repaint();
}
我在等一个酒吧,一半是绿色,一半是红色。但是,我得到一个实心的红色条。
我已经为 p.getHealth 尝试了几个不同的值,但所有(我已经尝试过的)return 都是一个完全红色的条。 (除了 200,它 return 是一个绿色条)
- 不要覆盖
paint
,而是覆盖 paintComponent
- 在执行任何自定义绘画之前调用超级实现的绘画方法。
- 不要在paint方法中加载资源,绘画是为了绘画
只要。
- 不要直接从代码中引用
src
,它
应用程序打包后将不存在
我 "suspect" 那 p.getHealth()
和 p.getHealthTotal()
是 int
,这意味着结果也被截断为 int
,丢弃您感兴趣的部分。
一种解决方案是在计算时将它们设为 double
或将 p.getHealthTotal()
转换为 double
。
话虽如此,我也想对你的绘画顺序做一些小的修改。
绘画应该以相反的顺序进行(从背景到前景),我会简单地将背景涂成红色以占据整个范围,因为做很多其他事情是没有意义的...
g2d.setColor(Color.RED);
g2d.fillRoundRect(
5,
5, 90,
10, 5, 5);
g2d.setColor(Color.GREEN);
g2d.fillRoundRect(
5, 5,
(int)((health / totalHealth) * 90), 10, 5, 5);
g2d.setColor(Color.BLACK);
g2d.drawRoundRect(
5, 5,
90, 10, 5, 5);
输出...
试图在我的播放器上方制作一个健康栏(使用 2d 图形),但我遇到了问题。
我确定我给出的是 int 而不是 double。
f 是我的 JFrame。 f.board 是一个 JLabel 数组 (17x17),这是我的游戏板 p getHealth returns 100 p getHealthTotal returns 200 您看到的 50 代表健康栏应该有多大
void paint() {
f.glass = new JPanel() {
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.drawImage(img, f.board[p.getY()][p.getX()].getX() - 28, f.board[p.getY()][p.getX()].getY() - 20,
null);
g2d.setColor(Color.BLACK);
g2d.drawRoundRect(f.board[p.getY()][p.getX()].getX() + 5, f.board[p.getY()][p.getX()].getY() - 35,
50, 10, 5, 5);
g2d.setColor(healthColor);
g2d.fillRoundRect(f.board[p.getY()][p.getX()].getX() + 5,f.board[p.getY()][p.getX()].getY() - 35,
(p.getHealth() / p.getHealthTotal()) * 50, 10,5,5);
g2d.setColor(damageColor);
g2d.fillRoundRect(f.board[p.getY()][p.getX()].getX() + 5 + (p.getHealth() / p.getHealthTotal()) * 50,
f.board[p.getY()][p.getX()].getY() - 35, 50 - ( p.getHealth() / p.getHealthTotal()) * 50,
10, 5, 5);
/*g2d.setColor(Color.BLACK);
g2d.drawRoundRect(f.board[p.getY()][p.getX()].getX() + 10, f.board[p.getY()][p.getX()].getY() - 25, 40, 5, 5, 5);
g2d.setColor(expColor);
g2d.fillRoundRect(f.board[p.getY()][p.getX()].getX() + 10, f.board[p.getY()][p.getX()].getY() - 25, p.getExp() / 100 * 40, 5, 5, 5);
/*g2d.setColor(expBorder);
g2d.drawRoundRect(740, 10, 100, 40, 5, 5);
g2d.setColor(expColor);
g2d.fillRoundRect(740, 10, p.getExp(), 40, 5, 5);
g2d.setColor(healthBorder);
g2d.drawRoundRect(610, 10, 100, 40, 5, 5);
g2d.setColor(healthColor);
g2d.fillRoundRect(610, 10, p.getHealth() / p.getHealthTotal() * 100, 40, 5, 5);
p.ge*/
g2d.drawImage(Toolkit.getDefaultToolkit().getImage("src/BossBattles/Images/Settings.png"), 925, 15, null);
}
};
f.glass.setOpaque(false);
f.setGlassPane(f.glass);
f.glass.setVisible(true);
f.glass.repaint();
}
我在等一个酒吧,一半是绿色,一半是红色。但是,我得到一个实心的红色条。
我已经为 p.getHealth 尝试了几个不同的值,但所有(我已经尝试过的)return 都是一个完全红色的条。 (除了 200,它 return 是一个绿色条)
- 不要覆盖
paint
,而是覆盖paintComponent
- 在执行任何自定义绘画之前调用超级实现的绘画方法。
- 不要在paint方法中加载资源,绘画是为了绘画 只要。
- 不要直接从代码中引用
src
,它 应用程序打包后将不存在
我 "suspect" 那 p.getHealth()
和 p.getHealthTotal()
是 int
,这意味着结果也被截断为 int
,丢弃您感兴趣的部分。
一种解决方案是在计算时将它们设为 double
或将 p.getHealthTotal()
转换为 double
。
话虽如此,我也想对你的绘画顺序做一些小的修改。
绘画应该以相反的顺序进行(从背景到前景),我会简单地将背景涂成红色以占据整个范围,因为做很多其他事情是没有意义的...
g2d.setColor(Color.RED);
g2d.fillRoundRect(
5,
5, 90,
10, 5, 5);
g2d.setColor(Color.GREEN);
g2d.fillRoundRect(
5, 5,
(int)((health / totalHealth) * 90), 10, 5, 5);
g2d.setColor(Color.BLACK);
g2d.drawRoundRect(
5, 5,
90, 10, 5, 5);
输出...