1

我目前正在使用 Crafty 为班级开发一个小游戏,而我们的游戏需要时间的流逝。为了给出上下文,这是一个类似电子宠物的游戏,玩家控制一个生物并在需要时喂养它、梳理它等,所以我们需要测量诸如“每五分钟生物会饿”之类的时间或“经过一定时间(比如 20 分钟),该生物将因自然原因死亡,游戏将结束”。我的问题是我不确定解决此问题的最佳方法是什么。我应该使用 setInterval 吗?设置超时?我自己的计时器课?我不知道此类实例最常见的解决方案是什么。到目前为止,我已经尝试了前两个选项,但没有成功。

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

4

2 回答 2

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(打开浏览器控制台查看输出)。

于 2013-05-03T16:13:14.293 回答
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 或 HTML5LocalStorage来存储这些时间戳。这将允许您(实际上)使用更长的时间间隔,并让用户离开页面并返回从他们离开的地方继续(不过,我想会有相当多的其他数据会也需要存储,以允许用户离开和回来)。

于 2013-05-03T17:35:13.887 回答