#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. Хорошо, значит, это было не зря 🙂