关于applet最简单的图片移动效果的优化求解

08-06-28 roy2004

先贴出代码,没啥花头的,有幅背景图片,然后我让另一个小图片在背景图片上自动移动,效果也出来了,也没有闪烁,感觉是很不错的了,但是,我抱着试试看的态度请教一下,能不能有更好的效果?比方说,象gba模拟器上的移动效果,完全平滑,没有任何任何抖动,根本感觉不到图片一帧一帧地移动,但是我这段代码出来的效果,就是能感觉到图片是一帧一帧的移动,以目前我的能力,已经优化不了了。

谢谢。

public class flyDragon extends Applet implements Runnable{

Image bg,currentImg;

MediaTracker tracker;

Image []dragon=new Image[6];

int x,y=0;

int flydistance=20;

Thread thread;

int birdImage_width,bg_width,bg_height;

Image offScreenImage;

Graphics offScreenG;

Image offl;

public void init(){

tracker=new MediaTracker(this);

for(int i=0;i<dragon.length;i++){

dragon=getImage(this.getCodeBase(),"yidongtou2.png");

tracker.addImage(dragon, 0);

}

currentImg=dragon[0];

bg=getImage(this.getCodeBase(),"maxMap.PNG");

tracker.addImage(bg, 0);

try{

tracker.waitForAll();

}catch(Exception e){

e.printStackTrace();

}

bg_width=bg.getWidth(this);

bg_height=bg.getHeight(this);

this.setSize(720, 480);

}

public void start(){

if(thread==null){

thread=new Thread(this);

thread.start();

}

}

public void stop(){

if(thread!=null){

thread.stop();

thread=null;

}

}

public void run(){

birdImage_width=dragon[0].getWidth(this);

int i=0;int flag=0;

while(true){

i=(i+1)%dragon.length;

if(flag==0&&y<=700)y+=2;

if(y>700)flag=1;

if(flag==1&&y>0)y-=2;

if(y<0)flag=0;

repaint();

try {

Thread.sleep(66);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

public void paint(Graphics g){

g.drawImage(bg, 0, 0,720, 480,this);

g.drawImage(dragon[0], y, 0,this);

// g.drawImage(bg, 0, 0, 720, 480, 0, 0, 0, 0, this);

}

public void update(Graphics g){

Dimension d =this.size();

if(offl==null){

offl=this.createImage(720, 480);

offScreenG=offl.getGraphics();

}

offScreenG.clearRect(0,0,720, 480);

paint(offScreenG);

g.drawImage(offl, 0, 0,720, 480,null);

}

public static void main(String art[]){

flyDragon l = new flyDragon();

l.setSize(400,400);

l.setVisible(true);

}

}

roy2004
2008-06-28 20:04

补充一下,原因我也知道,因为我图片的移动每次偏移量是2,所以原理等于擦掉原来的,在新的地方重画,这样如果把偏移量设置为20,把睡眠时间设为1000,那么很明显的,图片的移动是呆滞机械的,而我看了下gba模拟器,把它调到最慢最慢,发现图片的移动是完全平滑,而不是擦除从前再画现在的这种机制,是非常非常连续的,所以我想请教java图片移动能否到如此完美的境界?谢谢