广

Java编程

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

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

    2018-10-18 20:40:04 次阅读 稿源:互联网
    零七广告


      一、游戏的框架
      
      我们的游戏需要一个通用的游戏框架,也方便以后的开发,但实现一个引擎是复杂的。作为初学者假如要你考虑太多的问题,恐怕会让你偏离主线,这里只给出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都需要很多的内存空间。
     

    零七网部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与零七网进行文章共享合作。

    零七广告
    零七广告
    零七广告
    零七广告