#java #image #2d #sprite
#java #изображение #2d #спрайт
Вопрос:
В Java я успешно отобразил изображение на экране. Теперь я хочу заставить его двигаться, запустив его через цикл for. Цикл for выполняется 10 раз и каждый раз отключается на 1 секунду. Вместо того, чтобы перемещать изображение каждую секунду, как ожидалось, мне нужно подождать 10 секунд, затем появится 10 изображений.
Вот мой код:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JComponent;
import javax.swing.JFrame;
public class ImageDraw extends JComponent {
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
Image img1 = Toolkit.getDefaultToolkit().getImage("player.png");
int x = 0;
int y = 0;
for(int i = 0;i<10;i ){
try {
Thread.sleep(1000);
x =10;
y =10;
g2.drawImage(img1, x, y, this);
repaint();
} catch (InterruptedException e) {
e.printStackTrace();
System.exit(0);
}
} //end for
} //end paint
} //end class
Как бы мне сделать так, чтобы изображение выглядело так, как будто оно перемещается каждый раз, когда оно проходит через цикл?
Ответ №1:
В дополнение к другим предложениям:
-
Никогда не считывайте изображение в методе рисования. Считывайте изображение при создании класса или передавайте изображение с помощью метода setImage(…).
-
Пользовательское рисование выполняется путем переопределения метода paintComponent(), а не метода paint().
Ответ №2:
Используйте a Timer
для этого и избавьтесь от Thread.sleep()
. Вы запускаете этот код в потоке пользовательского интерфейса, и при вызове Thread.sleep()
вы переводите поток пользовательского интерфейса в спящий режим, что означает отсутствие обновления до завершения всего цикла.
Комментарии:
1. Вот хороший учебник по созданию анимации спрайтов, подобной этой . Взгляните конкретно на код для Board.java , который использует таймер для выполнения действия каждые 5 миллисекунд. Ваш код можно легко модифицировать, чтобы он работал таким образом.