第六天 offScreen

来源:互联网 发布:sqlserver rollback 编辑:程序博客网 时间:2024/06/12 17:15

 做图的人对这个应该都不陌生,为了达到加速显示和无闪烁,常用的一种桌面映像。用法有很多,在此不一一介绍。

 

随手改写了一下backCanvas.java, 将绘制过程从系统的paint过程改到selfPaint中。在按下选中健时,两个不同的绘制过程。

 

实际应用中,如果使用offScreen,需要对程序更加精确的控制,绘制的技巧也更丰富。但要防止绘制发生的死锁。如果是慢速画面或者画面变化元素不是很多,可以直接用paint

 

实例代码如下:

import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.game.TiledLayer;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.Graphics;

public class BackCanvas extends GameCanvas {
     private Scence scence;
     private LayerManager layerManager;
     private TiledLayer  backLayer;
     public Sprite Sore;
     private int MainPaint=1;
 
 public BackCanvas(){
  super(false);
  scence = new Scence();
  scence.screenX =0;
  scence.screenY =0;
  Sore=scence.LoadSprite("Sore");
 
  layerManager = new LayerManager(); 
  Image temp= scence.init();
  backLayer = new TiledLayer(1,1,temp,temp.getWidth(),temp.getHeight());
  backLayer.setCell(0, 0, 1);
  layerManager.append(Sore);  //添加顺序决定覆盖。
  layerManager.append(backLayer);
 }
 
 public void paint(Graphics g){
  //this.flushGraphics();
 }
 
 public void selfPaint(Graphics g){
   scence.painting =true;
   try{
    layerManager.setViewWindow(scence.screenX, scence.screenY, scence.screenWidth, scence.screenHeight);
    layerManager.paint(g, 0, 20);
    if (scence.DEBUG)
     System.out.println("paint() Executed!");
   }catch (Exception e){
    System.out.println("绘制过程出现故障");
   }finally{
    scence.painting =false;
   }
   MainPaint=MainPaint-1;
 }
 
 protected void keyPressed(int keyCode){
  SpeakAni ani;
  int oldx=scence.screenX;
  int oldy=scence.screenY;
  try{
   if (scence.painting) return;
   switch (keyCode) {
   case -1:if (scence.screenY>scence.unitHeight) scence.screenY=scence.screenY-scence.unitHeight; break;
   case -2:if (scence.screenY<scence.backHeight-scence.screenHeight-scence.unitHeight) scence.screenY=scence.screenY+scence.unitHeight;break;
   case -3:if (scence.screenX>scence.unitWidth) scence.screenX=scence.screenX-scence.unitWidth; break;
   case -4:if (scence.screenX<scence.backWidth-scence.screenWidth-scence.unitWidth) scence.screenX=scence.screenX+scence.unitWidth;break;
   //case -5:{ani= new SpeakAni(this);ani.setPriority(1); ani.start();} //过高的线程优先级会导致线程sleep 也优先执行。
   case -5:{Graphics g=getGraphics(); 
      if (MainPaint==1) {
       g.setColor(0x00FF00); g.fillRect(0,0,getWidth(), getHeight());
      }
      else{
       g.setColor(0x0000FF); g.fillRect(0,0,getWidth()/2, getHeight()/2);
      }
      selfPaint(g); this.flushGraphics();
      }
   } 
   System.out.println(keyCode);
  }catch (Exception e){
   System.out.println("捕获不明错误");
   scence.screenX=oldx;
   scence.screenY=oldy;
  }
  this.repaint();
  if (scence.DEBUG) System.out.println("keyPressed() Executed!");
 }
}

 

原创粉丝点击