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

时间:2019-01-11 03:18:10

标签: java swing awt

尝试在播放器上方制作一个健康栏(使用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会返回绿色条)

1 个答案:

答案 0 :(得分:1)

  1. 请勿覆盖paint,而应覆盖paintComponent
  2. 在执行任何自定义绘制之前,请调用paint方法的超级工具。
  3. 不要在绘画方法中加载资源,绘画是用于绘画 只要。
  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