程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> J2ME 2D小游戲入門之游戲的框架

J2ME 2D小游戲入門之游戲的框架

編輯:JAVA編程入門知識


  一、游戲的框架
  
  我們的游戲需要一個通用的游戲框架,也方便以後的開發,但實現一個引擎是復雜的。作為初學者假如要你考慮太多的問題,恐怕會讓你偏離主線,這裡只給出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都需要很多的內存空間。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved