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 是一个绿色条)

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

输出...