J2ME 2D小游戏入门之游戏的框架

 

J2ME 2D 小游戏入门之游戏的框架
 一、游戏的框架

  我们的游戏需要一个通用的游戏框架,也方便以后的开发,但实现一个引擎是复杂的。作为初学者如果要你考虑太多的问题,恐怕会让你偏离主线,这里只给出 canvas 的代码,不理解可以参看本站的另外一篇系列文章《使用 MIDP2.0 开发游戏》。
public class MyGameCanvas extends GameCanvas
  implements Runnable, CommandListener{
   private static MyGameCanvas instance;
   Graphics g;
   boolean running;
   Thread t;
   Command startcmd,exitcmd,restartcmd;
   int keystate;
   boolean keyevent;
   boolean key_up,key_down,key_left,key_right,key_fire;
   private boolean allowinput;
   public int screenwidth;
   public int screenheight;
   boolean gameover;
   //define your variable here
   //define your variable end
   protected MyGameCanvas() {
    super(true);
    g=getGraphics();
    running=false;
    t=null;
    addCommand(startcmd=new Command("start",Command.OK,1));
    addCommand(exitcmd=new Command("exit",Command.EXIT,1));
    setCommandListener(this);
    screenwidth=getWidth();
    screenheight=getHeight();
    //put your init once code here
    //put your init once code end
   }
   synchronized public static MyGameCanvas getInstance() {
    if (instance == null) {
     instance = new MyGameCanvas();
     System.out.println("new MyGameCanvas");
    }
    return instance;
   }
   public void run(){
    System.out.println("MyGameCanvas run start");
    long st=0,et=0,diff=0;
    int rate=50;//16-17 frame per second
    while(running){
     st=System.currentTimeMillis();
     gameinput();
     gameMain();
     et=System.currentTimeMillis();
     diff=et-st;
     if(diff<rate){
      //System.out.println("Sleep "+(rate-diff));
      try {
       Thread.sleep(rate - diff);
      }
      catch (InterruptedException ex) {}
     }else{
      //System.out.println("rush , and the frame using time: "+diff);
     }
    }
    System.out.println("MyGameCanvas run end");
   }
   public void start(){
    if(!running){
     running=true;
     t=new Thread(this);
     t.start();
    }
   }
   private void gameMain() {
    g.setColor(0,0,0);//clear screen
    g.fillRect(0,0,getWidth(),getHeight());
    flushGraphics();
   }
   private void gameInit() {
    gameover=false;
    allowinput=true;
    key_up=key_down=key_left=key_right=key_fire=false;
   }
   public void stop(){
    if(running){
     running = false;
    }
   }
   public void commandAction(Command c, Displayable d) {
    String cmdstr=c.getLabel();
    if(cmdstr.equals("start")){
     gameInit();
     start();
     removeCommand(startcmd);
     addCommand(restartcmd=new Command("restart",Command.OK,1));
    }else if(cmdstr.equals("restart")){
     stop();
     while(t.isAlive());
      gameInit();
     start();
    }else if(cmdstr.equals("exit")){
     stop();
     Navigate.midlet.destroyApp(false);
     Navigate.midlet.notifyDestroyed();
    }
   }
   private void gameinput() {
    if(allowinput){
     keystate=getKeyStates();
     keyevent=false;
     if((keystate & UP_PRESSED)!=0){//up
      key_up=true;keyevent=true;
      //deal your unstop job code here
      //System.out.println("up press");
      //deal your unstop job code end
     }else if((keystate & UP_PRESSED)==0){//release key
      if(key_up==true){
       key_up=false;
       //deal your one press-one job code here
       //System.out.println("up release");
       //deal your one press-one job code end
      }
     }
     if((keystate & DOWN_PRESSED)!=0){//down
      key_down=true;keyevent=true;
      //deal your unstop job code here
      //System.out.println("down press");
      //deal your unstop job code end
     }else if((keystate & DOWN_PRESSED)==0){//release key
      if(key_down==true){
       key_down=false;
       //deal your one press-one job code here
       //System.out.println("down release");
       //deal your one press-one job code end
      }
     }
    if((keystate & LEFT_PRESSED)!=0){//left
     key_left=true;keyevent=true;
     //deal your unstop job code here
     //System.out.println("left press");
     //deal your unstop job code end
    }else if((keystate & LEFT_PRESSED)==0){//release key
     if(key_left==true){
      key_left=false;
      //deal your one press-one job code here
      //System.out.println("left release");
      //deal your one press-one job code end
     }
    }
    if((keystate & RIGHT_PRESSED)!=0){//right
     key_right=true;keyevent=true;
     //deal your unstop job code here
     //System.out.println("right press");
     //deal your unstop job code end
    }else if((keystate & RIGHT_PRESSED)==0){//release key
     if(key_right==true){
      key_right=false;
      //deal your one press-one job code here
      //System.out.println("right release");
      //deal your one press-one job code end
     }
    }
   if((keystate & FIRE_PRESSED)!=0){//fire
    key_fire=true;keyevent=true;
    //deal your unstop job code here
    //System.out.println("fire press");
    //deal your unstop job code end
   }else if((keystate & FIRE_PRESSED)==0){//release key
    if(key_fire==true){
     key_fire=false;
     //deal your one press-one job code here
     //System.out.println("fire release");
     //deal your one press-one job code end
    }
   }
   if(!keyevent){
    //no keyevent here
    //System.out.println("NO KEY press");
    //no keyevent end
   }
  }
}

public static void cleanJob(){
  instance=null;
}

}

  使用 singlon 实现,因为每个 gamecanvas 都需要很多的内存空间。另外对我们来说,只要改写 gameInit() gameMain(), 一次性初始化的代码写在构造函数中。



 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值