背景图片连续滚动,程序已经跑过。前提!背景图片宽度比窗体长些,代码如下:
import Java.awt.Graphics;import java.awt.Image;import javax.swing.ImageIcon;import mine.game.util.PropertiesUtil;@SuppressWarnings("serial")public class GameFrame extends MyFrame{private Image img=ImageUtil.imageLoad("image/bk.jpg");double movs,speed=1,headmovs;double pWidth,pHeight,bgWidth;@Overridepublic 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() {@Overridepublic 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不凑效,其有自己先进的实现方式(自己猜的,有时间学学) */@Overridepublic 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);}}
希望以上内容代码对您有所帮助
新闻热点
疑难解答
图片精选