在Java上编写垂直滚动游戏



我正在尝试写一个游戏,其中玩家是一个角色,在地球上无力地落下。但是,我从一开始就陷入了编程,以编程滚动背景。我当前的方法是创建一个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

相关内容

  • 没有找到相关文章

最新更新