Игра Java Snake. Почему это изображение рисуется в совершенно неправильном месте

#java

#java — язык #java

Вопрос:

Я создаю простую игру Snake на Java, и я хочу использовать изображение, а не g.drawOval для вишенки на моем игровом поле. Местоположение вишни генерируется случайным образом каждый раз, когда игра загружается, или вишня съедается.

Если я использую метод g.fillOval, вишенка каждый раз рисуется в правильном месте, но если я использую изображение, вишенка каждый раз рисуется в неправильном месте.

Вот изображение нарисованной вишни с ТОЧНО такими же координатами (я использую точку для обозначения вишни), но вы можете видеть явные различия в местоположении.

Рандомизация местоположения вишни работает так, как задумано, это проблема с отрисовкой изображения

Вот результат моего кода:

введите описание изображения здесь

Красная точка — это g.fillOval и это правильное расположение вишни. Вишневое изображение — это то место, где мой g.drawImage помещает вишню.

X / Y для приведенного выше изображения Cherry X/Y: 49 : 27

Это код, который отображает игру:

 import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;

import javax.swing.JPanel;


public class Render extends JPanel {


    private static final Color BG = new Color(0);
    private static final Color SNAKEBODY = new Color(3380564);
    private static final Color SNAKEHEAD = new Color(16724736);

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(BG);
        g.fillRect(0, 0, 800, 700);
        Snake snake = Snake.snake;
        g.setColor(SNAKEBODY);
        for (Point point : snake.snakeParts) {
            g.fillOval(point.x * Snake.SCALE, point.y * Snake.SCALE,
                    Snake.SCALE, Snake.SCALE);
        }
        g.setColor(SNAKEHEAD);
        g.fillOval(snake.head.x * Snake.SCALE, snake.head.y * Snake.SCALE,
                Snake.SCALE, Snake.SCALE);
        g.setColor(Color.RED);

        g.drawImage(snake.cherryImg, snake.cherry.x,  snake.cherry.y, snake.cherryImg.getWidth(null), snake.cherryImg.getHeight(null), null);
        g.fillOval(snake.cherry.x * 10, snake.cherry.y * 10,10, 10);
        //debug line
        System.out.println("Cherry X/Y: "   snake.cherry.x   " : "   snake.cherry.y);

        String string = "Score: "   snake.score   ", Length: "
                  snake.snakeSize;
        g.setColor(Color.white);
        //simple math to center ish text.
        g.drawString(string, (int) (getWidth() / 2 - string.length() * 2.5f),
                10);
        string = "Game Over!";
        if (snake.over){
            g.drawString(string,
                    (int) (getWidth() / 2 - string.length() * 2.5f),
                    (int) snake.dim.getHeight() / 4);
        }
        string = "Paused!";
        {
            if (snake.paused amp;amp; !snake.over){
                g.drawString(string,
                        (int) (getWidth() / 2 - string.length() * 2.5f),
                        (int) snake.dim.getHeight() / 4);
            }
        }
    }
}
  

Может ли Энди Боди понять, почему в рисунке на этих линиях есть различия:

 g.drawImage(snake.cherryImg, snake.cherry.x,  snake.cherry.y,snake.cherryImg.getWidth(null), snake.cherryImg.getHeight(null), null);
g.fillOval(snake.cherry.x * 10, snake.cherry.y * 10, 10, 10);
//debug line
System.out.println("Cherry X/Y: "   snake.cherry.x   " : "   snake.cherry.y);
  

Комментарии:

1. Похоже, что вы не передаете те же координаты? Похоже, что изображение находится в (x,y) , а овал находится в (x*10,y*10) . Почему эти две строки должны быть одинаковыми?

Ответ №1:

Посмотрите на свои две позиции.

Ваш овал заливки происходит в snake.cherry.x*10 то время как изображение рисуется в snake.cherry.x (ТО ЖЕ САМОЕ Для Y)

Вот почему изображение находится на 49,27, а точка — на 490,270

Комментарии:

1. Случается со всеми. Удачи!

2. Возможно ли, что вы имели в виду » » десять, а не «*»; лол, я делал это раньше, и это довольно легко не заметить, так что не расстраивайтесь 🙂

Ответ №2:

Я предполагаю, что это происходит потому, что на изображении есть то, что я называю «Невидимым пером». Это дополнительные невидимые пиксели, которые не были обрезаны снаружи изображения. Зайдите в программу для редактирования изображений и обрежьте вишню снаружи, чтобы она соответствовала изображению.

Вы можете проверить это, нарисовав вишенку на 0, 0 . Если оно не прямо в углу, значит, на внешней стороне вашей вишни есть какое-то невидимое перо.

Редактировать:

Из приведенного выше ответа я вижу, что я был неправ относительно того, в чем заключалась ваша проблема. Я оставлю этот ответ на случай, если у кого-нибудь возникнет проблема, которую я перечислил.

Комментарии:

1. Ценю ответ, я тоже не был в курсе этой проблемы.

2. Хорошо, значит, это было не зря 🙂