饶荣庆 -- 您今天UCWEB了吗?--http://www.ucweb.com

3G 手机开发网

   :: 首页 :: 联系 :: 聚合  :: 管理
  99 Posts :: 1 Stories :: 219 Comments :: 0 Trackbacks
双缓冲技术的应用很广泛,设计游戏的时候更是需要它,

     在midp1.0中,api中并没有game这个包,看到网上很多人在讨论设计游戏的时候会出现图片断裂,屏幕闪烁等问题。

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

    

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

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

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

java 代码
  1. package org.wuhua.game;  
  2.   
  3. import javax.microedition.lcdui.Canvas;  
  4. import javax.microedition.lcdui.Graphics;  
  5. import javax.microedition.lcdui.Image;  
  6.   


  7.  

  8.   
  9. /** 
  10.  * 类名:GameCanvas.java 

     编写日期: 2006-11-29 

     程序功能描述:
     

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

     Demo: 

     Bug:
     

  12.  * 

     

  13.  *  
  14.  * 程序变更日期 :

     变更作者 :

     变更说明 :

     

  15.  *  
  16.  * @author wuhua 

     
     

  17.  */  
  18. public abstract class GameCanvas extends Canvas {  
  19.   
  20.     /** 
  21.      * 绘制缓冲的图片。用户绘制资源的时候都是操作这个图片来进行的 
  22.      */  
  23.     private Image bufferImage;  
  24.   
  25.     private int height;  
  26.   
  27.     private int width;  
  28.   
  29.     private int clipX, clipY, clipWidth, clipHeight;  
  30.   
  31.     private boolean setClip;  
  32.   
  33.     protected GameCanvas() {  
  34.   
  35.         super();  
  36.   
  37.         width = getWidth();  
  38.         height = getHeight();  
  39.   
  40.         this.bufferImage = Image.createImage(width, height);  
  41.   
  42.     }  
  43.   
  44.     protected void paint(Graphics g) {  
  45.         //如果要求绘制指定区域的话就需要这样了  
  46.         if (this.setClip) {  
  47.             g.clipRect(this.clipX, this.clipY, this.clipWidth, this.clipHeight);  
  48.             this.setClip = false;  
  49.         }  
  50.         g.drawImage(this.bufferImage, 00, Graphics.TOP | Graphics.LEFT);  
  51.   
  52.     }  
  53.   
  54.     public void flushGraphics(int x, int y, int width, int height) {  
  55.         this.setClip = true;  
  56.         this.clipX = x;  
  57.         this.clipY = y;  
  58.         this.clipWidth = width;  
  59.         this.clipHeight = height;  
  60.   
  61.         repaint();  
  62.         serviceRepaints();  
  63.     }  
  64.   
  65.     public void flushGraphics() {  
  66.         repaint();  
  67.         serviceRepaints();  
  68.     }  
  69.   
  70.     /** 
  71.      * 设计者主要是通过调用这个方法获取图片。然后就可以绘制了 
  72.      * @return 
  73.      */  
  74.     protected Graphics getGraphics() {  
  75.         return this.bufferImage.getGraphics();  
  76.     }  
  77.   
  78.     /** 
  79.      * 这个方法主要是处理Nokia平台,用户调用setFullScreenMode(boolean enable) 时重新按照新的w & h创建缓冲图片 
  80.      */  
  81.     protected final void sizeChanged(int w, int h) {  
  82.         if (h > height) {  
  83.             this.bufferImage = Image.createImage(w, h);  
  84.         }  
  85.     }  




爬虫工作室 -- 专业的手机软件开发工作室
3G视线 -- 专注手机软件开发
posted on 2007-03-21 17:45 3G工作室 阅读(1233) 评论(0)  编辑  收藏 所属分类: j2me

只有注册用户登录后才能发表评论。


网站导航: