问题描述
我尝试写一个人物行走的动画。我使用了双缓冲技术,但是屏幕仍然会闪烁,希望大家能够帮我找到其中的错误。代码如下:(1)精灵类packagesprite;importjava.awt.*;importjava.awt.image.*;importjavax.swing.*;publicclassSprite{publicintm_posX=0,m_posY=0;privateImagepic[]=null;privateintmPlayID=0;booleanmFacus=true;publicSprite(){pic=newImage[4];for(inti=0;i<4;i++){pic[i]=Toolkit.getDefaultToolkit().getImage("images\f"+i+".png");}}publicvoidinit(intx,inty){m_posX=x;m_posY=y;}publicvoidset(intx,inty){m_posX=x;m_posY=y;}publicvoidDrawSprite(Graphicsg,JPaneli){g.drawImage(pic[mPlayID],m_posX,m_posY,(ImageObserver)i);mPlayID++;if(mPlayID==4)mPlayID=0;}publicvoidUpdateSprite(){if(mFacus==true)m_posX+=15;if(m_posX==300)m_posX=0;}}(2)面板类packagesprite;importjava.awt.*;importjavax.swing.*;publicclassSpritePanelextendsJPanelimplementsRunnable{privateSpriteplayer;privateImageiBuffer;privateGraphicsgBuffer;publicSpritePanel(){player=newSprite();Threadt=newThread(this);t.start();}publicvoidrun(){while(true){player.UpdateSprite();try{Thread.sleep(300);}catch(InterruptedExceptione){}repaint();}}publicvoidpaint(Graphicsg){if(iBuffer==null){iBuffer=createImage(this.getSize().width,this.getSize().height);gBuffer=iBuffer.getGraphics();}gBuffer.setColor(getBackground());gBuffer.fillRect(0,0,this.getSize().width,this.getSize().height);player.DrawSprite(gBuffer,this);g.drawImage(iBuffer,0,0,this);}publicvoidupdate(Graphicsg){paint(g);}}
解决方案
解决方案二:
自己改了很久了,始终不知道错误所在,希望大家帮忙找一下错误。万分感谢!
解决方案三:
我前面也遇到过有个网上的双缓冲部分是错的我给你个新的你把原来双缓冲的部分去掉换成我这个/***增加双缓冲来缓解图片的闪烁*/privateImageiBuffer;privateGraphicsgBuffer;publicvoidupdate(Graphicsscr){if(iBuffer==null){iBuffer=createImage(this.getSize().width,this.getSize().height);gBuffer=iBuffer.getGraphics();}gBuffer.setColor(getBackground());gBuffer.fillRect(0,0,this.getSize().width,this.getSize().height);paint(gBuffer);scr.drawImage(iBuffer,0,0,this);}你把这段代码放在窗口类中就行了
解决方案四:
我按照你的方法尝试了一下,但是不知道为什么屏幕不能清除之前的图像了(就是人物行走的时候出现重影,并且一直留在那里)。我的update方法是按照你的改的。paint方法我是这样写的publicvoidpaint(Graphicsg){player.DrawSprite(g,this);}能再帮我看一看吗?非常感谢!
解决方案五:
引用2楼EndlessGhost的回复:
我前面也遇到过有个网上的双缓冲部分是错的我给你个新的你把原来双缓冲的部分去掉换成我这个/***增加双缓冲来缓解图片的闪烁*/privateImageiBuffer;privateGraphicsgBuffer;publicvoidupdate(Graphicsscr){if(iBuffer==null){iBuffer=createImage(this.getSize().width,this.getSize().height);gBuffer=iBuffer.getGraphics();}gBuffer.setColor(getBackground());gBuffer.fillRect(0,0,this.getSize().width,this.getSize().height);paint(gBuffer);scr.drawImage(iBuffer,0,0,this);}你把这段代码放在窗口类中就行了
能帮我再看一下吗?非常感谢!
解决方案六:
packagePlaneGameUtil;importjava.awt.Frame;importjava.awt.Graphics;importjava.awt.Image;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;/***将一些公用的代码组成一个父类*@authorAdministrator**/publicclassMyFrameextendsFrame{/***游戏窗口*/publicvoidlaunchFrame(){setSize(Constant.GAME_HIGHT,Constant.GAME_WIDTH);setLocation(100,100);setVisible(true);//默认的的窗口为隐藏的要将值设置为true才能变成可视化。newPaintThread().start();//启动重画窗口的线程addWindowListener(newWindowAdapter(){//增加窗口监听内部类@OverridepublicvoidwindowClosing(WindowEvente){//重写windowClosing方法。System.exit(0);}});}/***增加双缓冲来缓解图片的闪烁*/privateImageiBuffer;privateGraphicsgBuffer;publicvoidupdate(Graphicsscr){if(iBuffer==null){iBuffer=createImage(this.getSize().width,this.getSize().height);gBuffer=iBuffer.getGraphics();}gBuffer.setColor(getBackground());gBuffer.fillRect(0,0,this.getSize().width,this.getSize().height);paint(gBuffer);scr.drawImage(iBuffer,0,0,this);}/***定义一个重画窗口的类它是一个内部类*@authorAdministrator**/classPaintThreadextendsThread{publicvoidrun(){while(true){repaint();try{Thread.sleep(30);}catch(InterruptedExceptione){e.printStackTrace();}//1s=1000ms}}}}你把你原来的面板类直接换成我的这个吧你的呢个我看着好乱我的这个我已经成功用过了你直接换掉看看效果
解决方案七:
引用5楼EndlessGhost的回复:
packagePlaneGameUtil;importjava.awt.Frame;importjava.awt.Graphics;importjava.awt.Image;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;/***将一些公用的代码组成一个父类*@authorAdministrator**/publicclassMyFrameextendsFrame{/***游戏窗口*/publicvoidlaunchFrame(){setSize(Constant.GAME_HIGHT,Constant.GAME_WIDTH);setLocation(100,100);setVisible(true);//默认的的窗口为隐藏的要将值设置为true才能变成可视化。newPaintThread().start();//启动重画窗口的线程addWindowListener(newWindowAdapter(){//增加窗口监听内部类@OverridepublicvoidwindowClosing(WindowEvente){//重写windowClosing方法。System.exit(0);}});}/***增加双缓冲来缓解图片的闪烁*/privateImageiBuffer;privateGraphicsgBuffer;publicvoidupdate(Graphicsscr){if(iBuffer==null){iBuffer=createImage(this.getSize().width,this.getSize().height);gBuffer=iBuffer.getGraphics();}gBuffer.setColor(getBackground());gBuffer.fillRect(0,0,this.getSize().width,this.getSize().height);paint(gBuffer);scr.drawImage(iBuffer,0,0,this);}/***定义一个重画窗口的类它是一个内部类*@authorAdministrator**/classPaintThreadextendsThread{publicvoidrun(){while(true){repaint();try{Thread.sleep(30);}catch(InterruptedExceptione){e.printStackTrace();}//1s=1000ms}}}}你把你原来的面板类直接换成我的这个吧你的呢个我看着好乱我的这个我已经成功用过了你直接换掉看看效果
不知道是不是我的电脑有问题。。。我改了之后还是闪。。你能把你的那个类似的程序发给我,我到我的电脑上试一试,然后再仔细研究研究。。可以吗。。。谢谢。。