Я делаю простую игру 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 && !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);
Посмотрите на свои две позиции.
Ваш заполняющий овал происходит на snake.cherry.x*10
пока изображение нарисовано на snake.cherry.x
(SAME FOR Y)
То почему изображение на 49,27 и точка на 490 270
Я предполагаю, что это происходит потому, что есть то, что я называю: "Невидимое перо", на изображении. Что это, дополнительные невидимые пиксели, которые не были обрезаны на внешней стороне изображения. Зайдите в программное обеспечение для редактирования изображений и обрезайте внешность вишни, чтобы она соответствовала изображению.
Вы можете проверить это, рисуя вишню в 0, 0
. Если он не находится прямо в углу, на внешней стороне вишни есть невидимое перо.
РЕДАКТИРОВАТЬ:
Я вижу по вышеприведенному ответу, что я ошибался в вашей проблеме. Я собираюсь оставить этот ответ на случай, если у кого есть проблема, которую я перечислил.
(x,y)
и овал в(x*10,y*10)
. Почему эти две строки будут одинаковыми?