gpt4 book ai didi

java - 2D 图形问题 - 可能是逻辑

转载 作者:行者123 更新时间:2023-12-02 10:23:33 25 4
gpt4 key购买 nike

尝试在我的播放器上方制作一个健康栏(使用 2d 图形),但我遇到了问题。

我已确保给出的是 int 而不是 double。

f 是我的 JFrame。f.board 是一个 JLabel 数组 (17x17),这是我的游戏板p getHealth 返回 100p 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 除外,它返回绿色条)

最佳答案

  1. 不要重写paint,而是重写paintComponent
  2. 在执行任何自定义绘制之前调用绘制方法 super 实现。
  3. 不要在paint方法中加载资源,绘画是为了绘画仅有的。
  4. 不要直接从代码中引用 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);

输出...

Example

关于java - 2D 图形问题 - 可能是逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54139933/

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