明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

J2ME游戲開發(fā)中時鐘的容易完成

[摘要]在java.util包中有一個TimerTask類,你可以擴展這個類并且實現(xiàn)他的run()方法,在run()方法中編寫我們的邏輯代碼。如果我們想制作一個游戲時鐘,那么非常簡單我們編寫一個GameClock類擴展TimerTask,GameClock需要維持一個實例變量timeLeft,這樣我們就可...

  在java.util包中有一個TimerTask類,你可以擴展這個類并且實現(xiàn)他的run()方法,在run()方法中編寫我們的邏輯代碼。如果我們想制作一個游戲時鐘,那么非常簡單我們編寫一個GameClock類擴展TimerTask,GameClock需要維持一個實例變量timeLeft,這樣我們就可以記錄游戲剩余的時間了,在每次run()運行的時候把timeLeft減1就可以了。有時候我們需要始終暫停以及重新啟動,這并不復雜,在GameClock中添加一個boolean類型的標記就可以了。下面給出GameClock的代碼:

/*
 * GameClock.java
 *
 * Created on 2005年7月18日, 上午11:00
 *
 * To change this template, choose Tools Options and locate the template under
 * the Source Creation and Management node. Right-click the template and choose
 * Open. You can then make changes to the template in the Source Editor.
 */

package com.j2medev.gameclock;
import java.util.TimerTask;
/**
 *
 * @author Administrator
 */
public class GameClock extends TimerTask{
   
    private int timeLeft = 60;//時鐘的默認時間
    private boolean pause = false;
    /** Creates a new instance of GameClock */
    public GameClock() {
    }
   
    public GameClock(int value){
        timeLeft = value;
    }
   
    public void run(){
        if(!pause){
            timeLeft--;
        }
    }
   
    public void pause(){
        pause = true;
    }
   
    public void resume(){
        pause = false;
    }
   
    public int getTimeLeft(){
        return timeLeft;
    }
   
    public void setTimeLeft(int _value){
        this.timeLeft = _value;
    }
}

  當我們使用這個時鐘的時候,只需要把它的一個實例作為參數(shù)傳給Timer的schedule()方法即可。例如

      clock = new GameClock(30);
      timer.schedule(clock,0,1000);

  接下來我們編寫一個簡單的游戲界面測試一下時鐘。我們在程序啟動的時候開始計時,每隔一秒鐘timeLeft會減少1,并且在手機屏幕上顯示當前剩余的時間。如果timeLeft為0的時候代表游戲已經(jīng)結束了。因此我們需要這樣判斷游戲的狀態(tài)。

    public void verifyGameState(){
        timeLeft = clock.getTimeLeft();
        if(timeLeft == 0){
            going = false;
        }
    }

  為了測試時鐘的暫停功能,我們接收用戶的按鍵行為,如果左鍵被按下,那么調(diào)用clock的pause()方法,如果右鍵被按下則調(diào)用clock的resume()方法。

    public void userInput(){
        int keyStates = this.getKeyStates();
        if((keyStates & GameCanvas.LEFT_PRESSED) != 0){
            clock.pause();
        }else if((keyStates & GameCanvas.RIGHT_PRESSED) != 0){
            clock.resume();
        }
           
    }

  下面給出MIDlet和Canvas的代碼:

/*
 * ClockCanvas.java
 *
 * Created on 2005年7月18日, 上午11:04
 *
 * To change this template, choose Tools Options and locate the template under
 * the Source Creation and Management node. Right-click the template and choose
 * Open. You can then make changes to the template in the Source Editor.
 */

package com.j2medev.gameclock;
import java.util.Timer;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.*;

/**
 *
 * @author Administrator
 */
public class ClockCanvas extends GameCanvas implements Runnable {
   
    private Timer timer = new Timer();
    private GameClock clock = null;
    private boolean going = true;
    int timeLeft = 0;
    /** Creates a new instance of ClockCanvas */
    public ClockCanvas() {
        super(false);
    }
   
    public void run(){
        clock = new GameClock(30);
        timer.schedule(clock,0,1000);
        while(going){
            verifyGameState();
            userInput();
            repaint();
            try{
                Thread.sleep(100);
            }catch(Exception e){
                e.printStackTrace();
            }
           
        }
    }
   
    public void userInput(){
        int keyStates = this.getKeyStates();
        if((keyStates & GameCanvas.LEFT_PRESSED) != 0){
            clock.pause();
        }else if((keyStates & GameCanvas.RIGHT_PRESSED) != 0){
            clock.resume();
        }
           
    }
   
    public void paint(Graphics g){
        int color = g.getColor();
        g.setColor(0xffffff);
        g.fillRect(0,0, this.getWidth(), this.getHeight());
        g.setColor(color);
       
        if(timeLeft == 0){
            g.drawString("游戲結束", this.getWidth()/2, this.getHeight()/4, Graphics.HCENTER Graphics.BOTTOM);
        }else{
            g.drawString("游戲剩余時間:"+timeLeft, this.getWidth()/2, this.getHeight()/4, Graphics.HCENTER Graphics.BOTTOM);
           
        }
       
       
    }
   
    public void verifyGameState(){
        timeLeft = clock.getTimeLeft();
        if(timeLeft == 0){
            going = false;
        }
    }
   
    public void start(){
        Thread t = new Thread(this);
        t.start();
    }
   
    public void stop(){
        going = false;
    }
   
}

/*
 * TestMidlet.java
 *
 * Created on 2005年7月18日, 上午11:00
 */

package com.j2medev.gameclock;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

/**
 *
 * @author  Administrator
 * @version
 */
public class TestMidlet extends MIDlet {
   
    private Display display = null;
   
    public void startApp() {
        display = Display.getDisplay(this);
        ClockCanvas canvas = new ClockCanvas();
        canvas.start();
        display.setCurrent(canvas);
    }
   
    public void pauseApp() {
    }
   
    public void destroyApp(boolean unconditional) {
    }
}

  程序運行的截圖如下:

   總結:本文實現(xiàn)了一個游戲開發(fā)中可能用到的時鐘程序,代碼并不復雜。希望能對大家有所幫助。