尝试在播放器上方制作一个健康栏(使用2d图形),但是我遇到了问题。
我已经确定要给出一个整数而不是两倍。
f是我的JFrame。 f.board是一个JLabel数组(17x17),是我在游戏中使用的板 p getHealth返回100 p getHealthTotal返回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尝试了几个不同的值,但是所有(我尝试过的)都返回一个完全红色的条。 (除了200会返回绿色条)
答案 0 :(得分:1)
paint
,而应覆盖paintComponent
src
,它会
应用打包后将不存在我“怀疑” 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);
输出...