escapeeCanvas.java
上传用户:gyyuli
上传日期:2013-07-09
资源大小:3050k
文件大小:7k
源码类别:

J2ME

开发平台:

Java

  1. import java.util.Random;
  2. import java.util.Vector;
  3. import javax.microedition.lcdui.*;
  4. import javax.microedition.lcdui.game.*;
  5. import javax.microedition.media.*;
  6. import java.io.*;
  7. class escapeeCanvas    extends GameCanvas    implements Runnable
  8. {
  9.     // shared direction constants
  10.     static final int BULLETS_NUM = 50;
  11.     static final int UP = 0;
  12.     static final int LEFT = 1;
  13.     static final int DOWN = 2;
  14.     static final int RIGHT = 3;
  15.     private TiledLayer background;
  16.     private Escapee escapee;
  17.     private Bullets bullets;
  18.     private Sprite explosion;
  19.     private int CanvasWidth = getWidth();
  20.     private int CanvasHeight = getHeight();
  21.     private Image image;
  22.     private static final int MILLIS_PER_TICK = 50;
  23.     private final escapeeMIDlet midlet;
  24.     private boolean isGameOver = false;
  25.     private boolean isCollidesWith = false;
  26.     private int explosionCnt = 4;
  27.     private final Graphics g;
  28.     private long gameDuration = 0;
  29.     private long startTime;
  30.     private volatile Thread animationThread = null;
  31.     
  32.     escapeeCanvas(escapeeMIDlet midlet)
  33.     {
  34.         super(true);   // suppress key events for game keys
  35.         this.midlet = midlet;
  36.         setFullScreenMode(false);
  37.         g = getGraphics();
  38.         load();
  39.         init();
  40.     }
  41.     public void keyPressed(int keyCode)
  42.     {
  43.         // The constructor suppresses key events for game keys, so we'll
  44.         // only get key events for non-game keys. The number keys, * & #
  45.         // have positive keyCodes, so negative keyCodes mean non-game
  46.         // special keys like soft-keys. We'll use key-presses on special
  47.         // keys to take us to the menu.
  48.         if (keyCode < 0)
  49.         {
  50.             stop();
  51.             midlet.GameCanvasMenu();
  52.         }
  53.     }
  54.     private void load()
  55.     {
  56.       image = midlet.createImage("/back_water.png");
  57.       int backColumns = CanvasWidth/image.getWidth()+1;
  58.       int backRows = CanvasHeight/image.getHeight()+1;
  59.       background = new TiledLayer(backColumns,backRows,image,image.getWidth(),image.getHeight());
  60.       int x,y;
  61.       for (int i = 0; i < backColumns*backRows; i++) 
  62.       {
  63.       x=i%backColumns;
  64.       y=i/backColumns;
  65.       background.setCell(x,y,1);
  66.       }
  67.      image = midlet.createImage("/Escapee.png");
  68.      escapee = new Escapee(image,image.getWidth()/3,image.getHeight());
  69.      escapee.setCanvasSize(CanvasWidth,CanvasHeight);
  70.      
  71.      image = midlet.createImage("/bullet.png");
  72.      bullets = new Bullets(image,image.getWidth(),image.getHeight());
  73.      bullets.setBulletsNum(BULLETS_NUM);
  74.      bullets.setCanvasSize(CanvasWidth,CanvasHeight);
  75.      
  76.      image = midlet.createImage("/explosion.png");
  77.      explosion = new Sprite(image,image.getWidth()/4,image.getHeight());
  78.      
  79.      image = midlet.createImage("/gameover.png");
  80.     }
  81.     public void init(){
  82.      escapee.setPosition(CanvasWidth/2,CanvasHeight/2);
  83.      bullets.initBullets();
  84.      explosion.setVisible(false);
  85.      explosion.setFrame(0);
  86.      explosionCnt = 4;     
  87.      isCollidesWith = false;
  88.      isGameOver = false;
  89.      gameDuration = 0;
  90.      escapee.setAlive(true);
  91.     }
  92.     
  93.     public synchronized void start()
  94.     {
  95.         animationThread = new Thread(this);
  96.         animationThread.start();
  97.         startTime = System.currentTimeMillis() - gameDuration;
  98.     }
  99.     public synchronized void stop()
  100.     {
  101.         gameDuration = System.currentTimeMillis() - startTime;
  102.         animationThread = null;
  103.     }
  104.     public void run()
  105.     {
  106.         Thread currentThread = Thread.currentThread();
  107.         try
  108.         {
  109.             // This ends when animationThread is set to null, or when
  110.             // it is subsequently set to a new thread; either way, the
  111.             // current thread should terminate
  112.             while (currentThread == animationThread)
  113.             {
  114.                 long startTime = System.currentTimeMillis();
  115.                 // Don't advance game or draw if canvas is covered by
  116.                 // a system screen.
  117.                 if (isShown())
  118.                 {
  119.                     input();
  120.                     tick();
  121.                     draw();
  122.                     
  123.                 }
  124.                 long timeTaken = System.currentTimeMillis() - startTime;
  125.                 if (timeTaken < MILLIS_PER_TICK)
  126.                 {
  127.                     synchronized (this)
  128.                     {
  129.                         wait(MILLIS_PER_TICK - timeTaken);
  130.                     }
  131.                 }
  132.                 else
  133.                 {
  134.                     currentThread.yield();
  135.                 }
  136.             }
  137.         }
  138.         catch (InterruptedException e)
  139.         {
  140.             // won't be thrown
  141.         }
  142.     }
  143.     private void tick()
  144.     {
  145.         // If player presses two or more direction buttons, we ignore them
  146.         // all. But pressing fire is independent. The code below also ignores
  147.         // direction buttons if GAME_A..GAME_D are pressed.
  148.         escapee.tick();
  149.         if(!isCollidesWith)bullets.tick();
  150.         if(isCollidesWith&&(explosionCnt!=0)){
  151.         
  152.             explosion.setFrame((explosionCnt-1));
  153.            
  154.             explosionCnt--;
  155.             if(explosionCnt == 0)isGameOver = true;
  156.             
  157.         }
  158.          
  159.         if(bullets.collidesWith(escapee)){
  160.         
  161.         isCollidesWith = true;
  162.         escapee.setAlive(false);
  163.         SoundEffects.getInstance().startBlastSound();
  164.         explosion.setPosition(escapee.getRefPixelX()-explosion.getWidth()/2,
  165.                               escapee.getRefPixelY()-explosion.getHeight()/2);
  166.         explosion.setVisible(true);
  167.         
  168.         
  169.         }
  170.         if(isGameOver){
  171.         long time = (System.currentTimeMillis() - startTime);
  172.         midlet.GameCanvasGameOver(time,BULLETS_NUM);
  173.         }
  174.     }
  175.     private void input() {
  176.         // If player presses two or more direction buttons, we ignore them
  177.         // all. But pressing fire is independent. The code below also ignores
  178.         // direction buttons if GAME_A..GAME_D are pressed.
  179.     int keyStates = getKeyStates();
  180.     if(escapee.isAlive()){
  181.     if ((keyStates & LEFT_PRESSED) != 0) escapee.move(LEFT);
  182.     else if ((keyStates & RIGHT_PRESSED) != 0) escapee.move(RIGHT);
  183.     else if ((keyStates & UP_PRESSED) != 0) escapee.move(UP);
  184.     else if ((keyStates & DOWN_PRESSED) != 0) escapee.move(DOWN);
  185.     }
  186.     }
  187.   
  188.     void vibrate(int millis)
  189.     {
  190.         midlet.vibrate(millis);
  191.     }
  192.     
  193.     // draw game
  194.     private void draw()
  195.     {
  196.      background.paint(g);
  197.      escapee.paint(g);
  198.      bullets.draw(g);
  199.      explosion.paint(g);
  200.      if(isCollidesWith&&!isGameOver)g.drawImage(image, 
  201.                                                 CanvasWidth/2,
  202.                                                 CanvasHeight/2,
  203.                                                 g.VCENTER|g.HCENTER);
  204.       
  205.      flushGraphics();
  206.     }
  207.     
  208. }