用来衡量时间流逝的脚本?

时间:2013-05-03 16:07:51

标签: javascript craftyjs

我正在开发一款使用Crafty的小型游戏,我们的游戏需要时间的流逝。为了给出背景,这是一个类似于tamagotchi的游戏,玩家在需要时控制生物并喂食它,修饰它等等,所以我们需要测量时间,例如“生物每饥饿五分钟”或“经过一段时间(比方说,20分钟)后,该生物将死于自然原因,游戏将结束”。我的问题是,我不确定最好的方法是什么。我应该使用setInterval吗? setTimeout的?我自己的计时器课程?我不知道这些实例最常见的解决方案是什么。到目前为止,我已经尝试了前两个选项而没有成功的结果。

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

2 个答案:

答案 0 :(得分: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(打开浏览器控制台查看输出)。

答案 1 :(得分:2)

您可以扩展它以在“时间”数组(或对象)中设置多个动态时间戳,或者甚至简单地作为单个变量,然后在操作发生时更新它们,而不是像在bfavartto的答案中那样使用单个时间戳。 p>

一个简单的版本就像:

// 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来存储这些时间戳。这将允许你(实际上)使用更长的时间间隔,以及让用户离开页面并返回他们离开的地方(但是,我想,会有相当数量的其他数据也需要存储,以便允许用户离开并返回)。