程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> 使用MIDP2.0開發游戲(6)設計Clock

使用MIDP2.0開發游戲(6)設計Clock

編輯:J2ME
MIDP2.0開發游戲(6)設計Clock 作者:asklxf    文章來源:J2MEdev.com    更新時間:2006-12-1 20:01:00 223

Clock負責提供一個真實時間和一個虛擬時間,真實時間從0開始按ms遞增,和硬件時鐘是同步的;虛擬時間也從0開始按ms遞增,但不一定和真實時間同步。

要獲得系統時間可以用System.currentTimeMillies(),系統硬件有一個計數器,當計算機啟動時,計數器從0開始每1ms加1,System.currentTimeMillIEs()返回從開機到現在經過的ms。我們不需要知道時分秒,只需要一個遞增的整數計時就可以了。

Clock改自Marshall "Game Programming Gems 3"中的C++代碼,主要成員變量:
thisTime:當前硬件時間,即System.currentTimeMillIEs()
systemTime:游戲的系統時間,即把thisTime轉換為從0遞增的時間
virtualTime:虛擬時間,從0遞增,但和真實時間不同步

代碼如下:

package game.engine.core;

class Clock {
    // Clock是否運行:
    private boolean running;

    // 當前hardware clock:
    private int thisTime;

    // record the last hardware clock when calling stop():
    private int lastTime;

    // systemTime從0開始遞增,和硬件時鐘同步:
    private int systemTime;
    // systemOffset就是硬件時鐘和systemTime的差:
    private int systemOffset;
    // 上一次停止的systemTime:
    private int pauseAt;

    // virtualTime starts from 0.
    private int virtualTime;
    // virtualOffset records how long the clock paused:
    private int virtualOffset;

    private int frameStart;
    private int frameEnd;
    private int frameCount;

    public Clock() {
        reset();
    }

    // 重置Clock:
    public void reset() {
        running = false;
        // get the hardware clock:
        thisTime = (int)System.currentTimeMillis();
        lastTime = thisTime;
        // and systemTime starts from 0:
        systemTime = 0;
        systemOffset = thisTime;
        pauseAt = 0;
        // init virtual time:
        virtualTime = 0;
        virtualOffset = 0;
        // init frame time:
        frameStart = 0;
        frameEnd = 0;
        frameCount = 0;
    }

    // 同步hardware clock:
    private void update() {
        lastTime = thisTime;
        thisTime = (int)System.currentTimeMillis();
        // increase the systemTime:
        systemTime += (thisTime - lastTime);
    }

    // 啟動Clock:
    public void start() {
        if(!running) {
            running = true;
            update();
            virtualOffset += (systemTime - pauseAt);
            System.out.println("[start]");
        }
    }

    // 停止Clock:
    public void stop() {
        if(running) {
            running = false;
            update();
            pauseAt = systemTime;
            System.out.println("[stop] at " + pauseAt);
        }
    }

    // Clock是否運行:
    pu
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved