技术开发 频道

关于J2ME GAME双缓冲实现探讨

  【IT168 技术】双缓冲技术的应用很广泛,设计游戏的时候更是需要它,在midp1.0中,api中并没有game这个包,看到网上很多人在讨论设计游戏的时候会出现图片断裂,屏幕闪烁等问题。

  我经过这几天的学习整理下自己的学习心得,用来抛砖,希望对此有研究高手们相互讨论。让我也学习学习。

  双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板。首先我们在内存环境中建立一个“虚拟“的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘 制完毕的时候,再一次性的把内存中绘制好的图形“拷贝”到另一块黑板(屏幕)上。采取这种方法可以提高绘图速度,极大的改善绘图效果。

  对于手机来说。具体的过程就是通过extends Canvas。然后获取bufferImage。再然后就getGraphics。最后就是在这个graphics中绘制图片等,再最后就是把这个绘制好的bufferImage绘制的屏幕上。

  说归说。具体还是要看代码的。里面的代码参照了一些开源的代码。

  Java 代码

  /********************************************************************

  *项目名称      :足球项目J2ME客户端

  *

  *Copyright2005-2006Teesoo.Allrightsreserved

  ********************************************************************/

  packageorg.wuhua.game;

  importjavax.microedition.lcdui.Canvas;

  importjavax.microedition.lcdui.Graphics;

  importjavax.microedition.lcdui.Image;

  /**

  *类名:GameCanvas.java

  编写日期:2006-11-29

  程序功能描述:

  *实现双缓冲的Game画布。实现原理是创建一个BufferImage。然后绘制,最后显示出来。就这么简单。

  Demo:

  Bug:

  *

  *

  *程序变更日期:

  变更作者:

  变更说明:

  *

  *@authorwuhua

  */

  publicabstractclassGameCanvasextendsCanvas{

  /**

  *绘制缓冲的图片。用户绘制资源的时候都是操作这个图片来进行的

  */

  privateImagebufferImage;

  privateintheight;

  privateintwidth;

  privateintclipX,clipY,clipWidth,clipHeight;

  privatebooleansetClip;

  protectedGameCanvas(){

  super();

  width=getWidth();

  height=getHeight();

  this.bufferImage=Image.createImage(width,height);

  }

  protectedvoidpaint(Graphicsg){

  //如果要求绘制指定区域的话就需要这样了

  if(this.setClip){

  g.clipRect(this.clipX,this.clipY,this.clipWidth,this.clipHeight);

  this.setClip=false;

  }

  g.drawImage(this.bufferImage,0,0,Graphics.TOP|Graphics.LEFT);

  }

  publicvoidflushGraphics(intx,inty,intwidth,intheight){

  this.setClip=true;

  this.clipX=x;

  this.clipY=y;

  this.clipWidth=width;

  this.clipHeight=height;

  repaint();

  serviceRepaints();

  }

  publicvoidflushGraphics(){

  repaint();

  serviceRepaints();

  }

  /**

  *设计者主要是通过调用这个方法获取图片。然后就可以绘制了

  *@return

  */

  protectedGraphicsgetGraphics(){

  returnthis.bufferImage.getGraphics();

  }

  /**

  *这个方法主要是处理Nokia平台,用户调用setFullScreenMode(booleanenable)时重新按照新的w&h创建缓冲图片

  */

  protectedfinalvoidsizeChanged(intw,inth){

  if(h>height){

  this.bufferImage=Image.createImage(w,h);

  }

  }

  }

0
相关文章