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

1

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

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

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

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

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

Изображение 174551

Красная точка - это 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 && !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);
  • 3
    Вы, кажется, не передаете те же самые координаты? Похоже, что изображение в (x,y) и овал в (x*10,y*10) . Почему эти две строки будут одинаковыми?
Теги:

2 ответа

3
Лучший ответ

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

Ваш заполняющий овал происходит на snake.cherry.x*10 пока изображение нарисовано на snake.cherry.x (SAME FOR Y)

То почему изображение на 49,27 и точка на 490 270

  • 0
    Ух ты. Разве я не чувствую себя глупо, полный контроль!
  • 0
    Бывает со всеми. Удачи!
Показать ещё 1 комментарий
2

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

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

РЕДАКТИРОВАТЬ:

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

  • 0
    Ценю ответ, я тоже не знал об этой проблеме.
  • 1
    Хорошо, так было не зря :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню