第四天 重新整理一下开始

来源:互联网 发布:网络宣传 编辑:程序博客网 时间:2024/05/08 19:25

 今天周末,把前两天学到的东西整理一下,规划一下类的分类和程序结构,分别有三个文件,

一、FD.java 使用MIDLet来控制程序的整体进程和安装环境配置定义;

二、BackCanvas使用GameCanvas来对屏幕绘制做出控制,该类增添了一些游戏常用的功能。还有TiledLayer和Sprite类作为Layer,配合LayerManager使用,对绘制的内容做出控制

三、Scence.java对场景做出描述,定义和控制。

 

 

import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.microedition.lcdui.Display;


public class FD extends MIDlet {
       Display display;
       BackCanvas backCanvas;


 public FD() {
  // TODO Auto-generated constructor stub
  display = Display.getDisplay(this);
  backCanvas = new BackCanvas();
 }

 

 protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
  // TODO Auto-generated method stub

 }

 

 protected void pauseApp() {
  // TODO Auto-generated method stub

 }

 

 protected void startApp() throws MIDletStateChangeException {
  // TODO Auto-generated method stub
  display.setCurrent(backCanvas);
 }

}

MIDLet的作用我们可以看手册,主要用于对程序的四个关键状态进行控制,调整。可以看做是整个程序的控制顶点。其他的关于执行环境的定义,安装等等,可以不知道,但不妨了解一下。你会在各款手机上看到“支持MIDP”的字样。系统与程序的交互过程,可以看一些MIDP的介绍。

 

 

 

import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.game.TiledLayer;
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 BackCanvas(){
  super(false);
  scence = new Scence();
  scence.screenX =0;
  scence.screenY =0;
  
  layerManager = new LayerManager();  
  Image temp= scence.init();
  backLayer = new TiledLayer(1,1,temp,temp.getWidth(),temp.getHeight());
  backLayer.setCell(0, 0, 1);
  layerManager.append(backLayer);
 }
 
 public void paint(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;
  }
  //this.flushGraphics();
 }
 
 protected void keyPressed(int keyCode){
  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;
   }   
  }catch (Exception e){
   System.out.println("捕获不明错误");
   scence.screenX=oldx;
   scence.screenY=oldy;
  }
  this.repaint();
  if (scence.DEBUG) System.out.println("keyPressed() Executed!");
 }
}

绘制了一张底图,用方向键可以移动。键盘响应的方法有很多。我在实现paint方法的时候有两个问题,一个,如果没有绘制过程的try..catch过程,调试器在快速连续点击时,可能会报错,但加上后,却没有捕获任何意外。第二,flashGraphics会交换前后显示缓存,如果在该位置调用,会把空白的缓存调到前面来。 明天要仔细看一下双缓存的相关内容。顺便解释一下,双缓存在屏幕快速替换,局部替换等方面都有用处。Layer的两个子类,这里只用了一个,另一个明天会继续测试。

TiledLayer的图例下标是从1开始的;但地图矩阵的下标是从(0,0)开始的。

回头多试几种键盘响应办法,另外,键盘挂接,键盘设置也该看看还有什么办法。

GameCanvas的Super()确定了键盘响应的方式。

 

 

import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

public class Scence {
 public boolean DEBUG=false;
 public int StageLevel=0;
 
 public final int screenWidth=200;
 public final int screenHeight=300;
 public final int unitWidth=20;
 public final int unitHeight=30;
 public int screenX=0;
 public int screenY=0;
 public int backWidth;
 public int backHeight;
 
 public boolean painting=false;
 
 public Image init(){
  Image temp;
  try{
   temp= Image.createImage("/Level"+StageLevel+".png");
  }catch (Exception e){
   System.out.println("读取地图错误。--"+"/Levle"+StageLevel+".png");
   return null;
  }  
  backWidth = temp.getWidth();
  backHeight= temp.getHeight();
  return temp;
 }
}
这里把一个简单的场景控制文件也发送出来。类设计当然可以更详细。刚开始,着重功能的学习。类分化,逐步根据共更能需要,重新设计累。另外,如何获得手机屏幕的大小呢?

原创粉丝点击