Я пытаюсь написать игру, в которой игрок является персонажем, бесконечно падающим на Землю. Тем не менее, я застрял в самом начале, программируя прокручивающийся фон. Мой текущий подход заключается в создании JFrame и добавлении к нему объекта класса, который расширяет JFrame. В этом втором классе я открываю фоновое изображение в конструкторе. Затем в первом классе я создаю новый поток для второго класса и чередую спать и перемещая y-координату фона. Вернемся ко второму классу, это движение вызывает перерисовку, и изображение рисуется дважды, один раз в y-координате и один раз на y-координате минус высота JPanel. Этот текущий код дает желаемый эффект при любом заданном кадре, но движение происходит медленно и неравномерно. Я думаю, что это имеет какое-то отношение к количеству запросов на перерисовку, но я довольно новичок в графике в java. Мой вопрос в том, может ли это быть исправлено, чтобы изображение неуклонно перемещалось по экрану, или я должен попробовать совершенно другой подход? Если мой текущий метод в корне ошибочен и не может быть исправлен, не могли бы вы спросить, как я могу создать гладкое движущееся изображение? Заранее спасибо.Написание вертикальной прокрутки в java
Это мой текущий код:
//ScrollingImage.java
import javax.swing.JFrame;
public class ScrollingImage {
public static void main(String[] args){
JFrame holder = new JFrame("New Game");
Background background = new Background();
Thread thread = new Thread(background);
holder.setSize(400, 400);
holder.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
holder.add(background);
holder.setVisible(true);
thread.start();
while (true){
background.move();
try {
thread.sleep(100);
}
catch (InterruptedException e){}
}
}
}
и:
//Background.java
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.File;
public class Background extends JPanel implements Runnable {
private BufferedImage image;
private int topEdgeY;
public Background(){
try {
image = ImageIO.read(new File("background.png"));
}
catch (Exception e){}
topEdgeY = 0;
}
public void run(){
repaint();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(image, 0, topEdgeY, getWidth(), getHeight(), this);
g.drawImage(image, 0, topEdgeY - getWidth(), getWidth(), getHeight(), this);
}
public void move(){
topEdgeY += 5;
if (topEdgeY == getWidth())
topEdgeY = 0;
repaint();
}
}