Java — Picture не отображается до конца цикла?

#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:

В дополнение к другим предложениям:

  1. Никогда не считывайте изображение в методе рисования. Считывайте изображение при создании класса или передавайте изображение с помощью метода setImage(…).

  2. Пользовательское рисование выполняется путем переопределения метода paintComponent(), а не метода paint().

Ответ №2:

Используйте a Timer для этого и избавьтесь от Thread.sleep() . Вы запускаете этот код в потоке пользовательского интерфейса, и при вызове Thread.sleep() вы переводите поток пользовательского интерфейса в спящий режим, что означает отсутствие обновления до завершения всего цикла.

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

1. Вот хороший учебник по созданию анимации спрайтов, подобной этой . Взгляните конкретно на код для Board.java , который использует таймер для выполнения действия каждые 5 миллисекунд. Ваш код можно легко модифицировать, чтобы он работал таким образом.