2013-05-03 106 views
1

我目前正在開發一款使用Crafty的小遊戲,而我們的遊戲需要時間的推移。爲了給出上下文,這是一個類似電子寵物的遊戲,玩家在需要時控制生物並餵食它,修剪它等等,因此我們需要測量時間,例如「生物每五分鐘飢餓一次」或「在一段時間後(比如說20分鐘),該生物將死於自然原因,遊戲將結束。」我的問題是,我不確定什麼是最好的方式去做這件事。我應該使用setInterval嗎? setTimeout的?我自己的計時課?我不知道這些實例最常見的解決方案是什麼。到目前爲止,我已經嘗試了前兩個選項,但沒有取得成功。腳本來衡量時間的流逝?

我也試過尋找任何時間的crafy功能;我能找到的最接近的是 Crafty.bind("EnterFrame", function() { ... }),所以我可以逐幀「操縱」時間,但這也不起作用。提前致謝。

回答

2

當遊戲開始時,獲取new Date().getTime()的時間戳,並將其保存在一個變量中。定期(可以使用setInterval),將其與當前時間戳進行比較,並根據已經過多少時間採取行動。

我建議使用定時事件構建一個數組,並從定時器回調中檢查其元素。事情是這樣的:

var startTime = new Date().getTime(); 

// List of timed events 
// (times are in milliseconds) 
var events = [ 
    { time: 5000, text: "do something after 5 secs"}, 
    { time: 10000, text: "do something after 10 secs"}, 
    { time: 20000, text: "do something after 20 secs"} 
]; 

// Check for events every second 
setInterval(function() { 
    var timePassed = new Date().getTime() - startTime; 
    console.log("passed: " + timePassed + " milliseconds"); 

    // Check all events 
    for(var i=events.length-1; i>=0; i--) { 

     // If an event has expired, remove it from the list, 
     // (and do whatever tou need to do) 
     if(events[i].time <= timePassed) { 

      // log the event text to the console 
      console.log(timePassed + "ms passed. " + events[i].text); 

      // remove from array 
      events.splice(i, 1); 
     } 
    } 

}, 1000); 

DEMO(打開你的瀏覽器控制檯查看輸出)。

+0

我不得不使用一段時間(在4000到6000毫秒之間,而不是要求差值等於5000),但它工作。雖然我可以有很多時間戳嗎?一個是吃飯,另一個是爲了修飾,另一個是爲了生物本身的生活?恐怕他們會相互衝突。 – 2013-05-03 17:12:01

+0

您只需要一個「參考」時間戳作爲開始時間,然後您就可以使用一組時間差異來觸發不同的操作。我用一個例子更新了答案。 – bfavaretto 2013-05-03 17:23:41

2

與bfavartto的答案中使用單個時間戳不同,您可以擴展該功能,以便在「時間」數組(或對象)中設置多個動態時間戳,甚至可以簡單地作爲單個變量,然後在動作發生時更新它們。

一個簡單的版本是這樣的:

// Initialize the variables at the beginning of the game 
var lifeStamp = new Date().getTime(); 
var foodStamp = lifeStamp ; 
var groomStamp = lifeStamp ; 

function feed() { 

    /*** Do feed-realted stuff here ***/ 

    // reset the "feed" timestamp 
    foodStamp = new Date().getTime(); 
} 

function groom() { 

    /*** Do groom-realted stuff ***/ 

    // reset the "groom" timestamp 
    groomStamp = new Date().getTime(); 
} 

這樣的話,你可以讓你的時間間隔,但通過重置您的間隔比較針對不同類型的動作時間戳重置。同時,「生命」時間戳將保持不變,而其他時間戳會改變。

編輯:重新尋找bfavartto的答案,它看起來像你將需要存儲過任何具體行動,事件和「原件」名單一樣,所以,隨着您重置時間戳,你可以重置與他們一起行動。

編輯#2:還有一件事。 。 。如果您希望這些生物持續超過當前的頁面加載時間,則可能需要考慮使用Cookie或HTML5的LocalStorage來存儲這些時間戳。這將允許您(實際上)使用更長的時間間隔,並讓用戶離開頁面並返回來接收他們離開的位置(儘管如此,我想可能會有大量的其他數據會還需要存儲,以允許用戶離開並返回)。

+0

感謝您的意見!我還沒有考慮過使用cookies。 – 2013-05-06 21:22:23