背景图片连续滚动,程序已经跑过。前提!背景图片宽度比窗体长些,代码如下:
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.csdn.net/hongyu83916/article/details/70161368