Выпуск 2D-графики - возможно, логика - PullRequest
0 голосов
/ 11 января 2019

Пытаюсь сделать индикатор здоровья выше моего игрока (используя 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 голосов
/ 11 января 2019
  1. Не переопределять paint, переопределять paintComponent вместо
  2. Вызовите методы рисования супер-инструмент перед выполнением любой пользовательской рисования
  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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...