public class BaseFrame extends JFrame{}
public static int frameWidth = 512; //游戏界面宽度
public static int frameHeight = 728; //游戏界面高度
要把游戏窗口放到正中间,首先获取屏幕分辨率。
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
接着设置大小和位置。
setBounds(((int)screenSize.getWidth()-frameWidth)/2,0,frameWidth,frameHeight);
设置布局方式。
setLayout(null);
我们将背景图片放在JPane容器上,再将JPanel容器加在窗体上。
//创建一个MyPanel对象
this.myPanel = new MyPanel();
//设置myPanel对象的位置大小
this.myPanel.setBounds(0, 0, frameWidth, frameHeight);
//将mypanel组件添加到窗口中
this.add(this.myPanel);
//显示窗口
setVisible(true);
//设置窗口的关闭行为
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
将背景图片放到Panel容器中
//存放背景图片
public Image bgImage;
public MyPanel(){
this.bgImage = Toolkit.getDefaultToolkit().getImage("images/bg01.jpg");
}
//绘制组件
public void paintComponent(Graphics g){
super.paintComponent(g);
//绘制背景图
g.drawImage(this.bgImage, 0, 0-this.bgImage.getHeight(this), this.bgImage.getWidth(this), this.bgImage.getHeight(this),null);
g.drawImage(this.bgImage, 0, 0, this.bgImage.getWidth(this), this.bgImage.getHeight(this),null);
}
启动窗口界面
new BaseFrame();
我们前面已经实现将两张相同的背景图片上下拼接起来,两张图片的坐标分别是(0,0 - 背景图片高度)和(0,0)。若要让背景图片滚动起来,我们需要设置一个不断变化的图片高度值top,使得两张背景图片的高度不断发生变化。所以改变两张背景图片的坐标为(0,top - 背景图片高度)、(0,top)。
图片滚动需要不断描绘画板,这里用线程实现。
public MyPanel myPanel;
//需要对放着背景图片的JPanel容器进行操作
public DrawableThread(MyPanel myPanel){
this.myPanel = myPanel;
}
public void run(){
while(true){
this.myPanel.repaint(); //重绘会调用myPanel的paintComponent方法
try {
this.currentThread().sleep(1);//每1毫秒运行一次
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
对MyPanel类进行修改
//计时器
public int timer = 0;
//图片原始高度
public int top = 0;
//线程
public DrawableThread drawableThread;
修改构造函数
public MyPanel(){
//创建线程 重绘JPanel
this.drawableThread = new DrawableThread(this);
//启动线程
this.drawableThread.start();
}
修改paintComponent函数
//绘制背景图
g.drawImage(this.bgImage, 0, top-this.bgImage.getHeight(this), this.bgImage.getWidth(this), this.bgImage.getHeight(this),null);
g.drawImage(this.bgImage, 0, top, this.bgImage.getWidth(this), this.bgImage.getHeight(this),null);
timer++;
//防止timer数据过大溢出
if(timer==10000){
timer = 0;
}
//每隔十毫秒,图片向下滚动
if(timer%10==0){
top++;
if(top>=this.bgImage.getHeight(this))
top = 0;
}