1

私は現在、Crafty を使用してクラス用の小さなゲームを開発しています。このゲームには時間の経過が必要です。文脈を説明すると、これはたまごっちのようなゲームで、プレイヤーがクリーチャーを操作し、必要に応じて餌をやったり、手入れをしたりします。そのため、「5 分ごとにクリーチャーが空腹になる」などの時間を測定する必要があります。 「一定時間(たとえば20分)が経過すると、クリーチャーは自然死し、ゲームは終了します」. 私の問題は、これを行う最善の方法がわからないことです。setInterval を使用する必要がありますか? setTimeout? 私自身のタイマークラス?このような場合の最も一般的な解決策が何であるかはわかりません。これまでのところ、最初の 2 つのオプションを試しましたが、成功していません。

また、時間の気の利いた関数を探してみました。私が見つけた最も近いものは だっ 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:もう1つ。. . これらのクリーチャーを現在のページ読み込み後も存続させたい場合は、Cookie または HTML5 を使用してLocalStorageこれらのタイムスタンプを保存することを検討することをお勧めします。これにより、(実際には)はるかに長い間隔を使用できるようになり、ユーザーがページを離れて戻ってきて中断したところから再開できるようになります(ただし、他にもかなりの量のデータがあると思いますユーザーが離れて戻ってくることができるようにするためにも保存する必要があります)。

于 2013-05-03T17:35:13.887 に答える