脚本来衡量时间的流逝?

脚本来衡量时间的流逝?

问题描述:

我目前正在开发一款使用Crafty的小游戏,而我们的游戏需要时间的推移。为了给出上下文,这是一个类似电子宠物的游戏,玩家在需要时控制生物并喂食它,修剪它等等,因此我们需要测量时间,例如“生物每五分钟饥饿一次”或“在一段时间后(比如说20分钟),该生物将死于自然原因,游戏将结束。”我的问题是,我不确定什么是最好的方式去做这件事。我应该使用setInterval吗? setTimeout的?我自己的计时课?我不知道这些实例最常见的解决方案是什么。到目前为止,我已经尝试了前两个选项,但没有取得成功。脚本来衡量时间的流逝?

我也试过寻找任何时间的crafy功能;我能找到的最接近的是 Crafty.bind("EnterFrame", function() { ... }),所以我可以逐帧“操纵”时间,但这也不起作用。提前致谢。

当游戏开始时,获取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

与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