背景图片连续滚动,程序已经跑过。前提!背景图片宽度比窗体长些,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
import Java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import mine.game.util.PropertiesUtil;
@SuppressWarnings ( "serial" )
private Image img=ImageUtil.imageLoad( "image/bk.jpg" );
double movs,speed= 1 ,headmovs;
double pWidth,pHeight,bgWidth;
@Override
public void paint(Graphics g) {
//g.drawImage(img, 0, 0, null);
//===================================================
pWidth=PropertiesUtil.getValue( "Width" , "game.properties" );
pHeight=PropertiesUtil.getValue( "Height" , "game.properties" );
bgWidth= new ImageIcon(img).getIconWidth();
//movs+=speed;
if (bgWidth>pWidth+movs){
g.drawImage(img, 0 , 0 , ( int )pWidth,( int )pHeight, ( int )movs, 0 , ( int )(pWidth+movs), ( int )pHeight, null );
}
if (bgWidth<=pWidth+movs){
headmovs=pWidth+movs-bgWidth;
g.drawImage(img, 0 , 0 , ( int )(pWidth-headmovs),( int )pHeight, ( int )movs, 0 , ( int )(bgWidth), ( int )pHeight, null );
g.drawImage(img,( int )(pWidth-headmovs), 0 , ( int )pWidth,( int )pHeight, 0 , 0 , ( int )(headmovs), ( int )pHeight, null );
if (headmovs>=pWidth){
//重新初始化所有变量数据,循环
movs=headmovs-pWidth;
}
}
movs+=speed;
//===================================================
}
public static void main(String[] args) {
GameFrame gf= new GameFrame();
gf.launchFrame();
}
}
//=================================
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import mine.game.util.PropertiesUtil;
@SuppressWarnings ( "serial" )
public class MyFrame extends Frame{
private BufferedImage imgBuffer;
private Graphics gBuffer;
public void launchFrame(){
int wd= 800 ; //PropertiesUtil.getValue("Width", "game.properties");
int ht= 600 ; //PropertiesUtil.getValue("Height", "game.properties");
setSize(wd,ht);
setLocation( 0 , 0 );
setVisible( true );
new PaintThread().start();
addWindowListener( new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit( 0 );
}
});
}
//重画窗口线程,内部类
class PaintThread extends Thread{
public void run(){
while ( true ){
repaint();
try {
Thread.sleep( 10 );
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 双缓冲解决,屏闪.此方法在,继承Frame的AWT编程中才有效。JFram不凑效,其有自己先进的实现方式(自己猜的,有时间学学)
*/
@Override
public void update(Graphics g) {
if (imgBuffer== null ){
imgBuffer=(BufferedImage)createImage( this .getWidth(), this .getSize().height); //创建图形缓冲
//imgBuffer=new BufferedImage((int)this.getSize().getWidth(),(int)this.getSize().getHeight(),BufferedImage.TYPE_4BYTE_ABGR);//创建图形缓冲
}
gBuffer=imgBuffer.getGraphics(); //获取图形缓冲区的图形上下文
gBuffer.fillRect( 0 , 0 , this .getWidth(), this .getHeight());
this .paint(gBuffer); //用paint方法中编写的绘图过程对图形缓冲区绘图
gBuffer.dispose(); //释放图形上下文资源
g.drawImage(imgBuffer, 0 , 0 , null ); //将图形缓冲区绘制到屏幕上
}
}
//====================
import java.awt.Image;
import java.awt.Toolkit;
import java.NET.URL;
public class ImageUtil {
public static Image imageLoad(String path){
URL u=ImageUtil. class .getClassLoader().getResource(path);
return Toolkit.getDefaultToolkit().getImage(u);
}
}
|
希望以上内容代码对您有所帮助
原文链接:http://blog.****.net/hongyu83916/article/details/70161368