我正在尝试写一个游戏,其中玩家是一个角色,在地球上无力地落下。但是,我从一开始就陷入了编程,以编程滚动背景。我当前的方法是创建一个Jframe并将其添加到扩展Jframe的类的对象。在第二类中,我打开了构造函数中的背景图像。然后,在第一类中,我为第二类创建了一个新线程,并替代睡觉并移动背景的y坐标。回到第二类,这种运动会触发重新粉刷,并在y坐标处绘制了两次图像,然后在y坐标处将其减去jpanel的高度。当前的代码在任何给定的框架下都会产生所需的影响,但是运动缓慢且不均匀。我认为这与重新粉刷请求的数量有关,但我对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();
}
}
您需要一个适当的游戏循环。当前,您的游戏在每次迭代后都可以入睡100毫秒,即(即使您的更新和渲染不需要时间)10FPS,并且随着您的游戏做更多的工作,它甚至会降低。
游戏循环是一个重要的话题,对于不同情况,有几种好方法是多人游戏或游戏中涉及多少物理学,但是就您而言,一个简单的方法就可以了。
关于游戏循环的好论文,希望这会让您理解:http://gameprogrammingpatterns.com/game-loop.html
和一个很好的例子在Java中写:http://www.java-gaming.org/index.php?topic=24220.0