1

JavaScriptでヘビゲームを作っているので、矢印キーを押すと「ヘビヘッド」がその方向に動き続けるはずです。

初めてキーを押すとうまくいきますが、その後は頭がどんどん速く動き続けます。

だから私が欲しいのは、100ミリ秒ごとに頭を動かすものです。私が言っていることが本当にわからない場合は、次のページをご覧ください:http ://www.dbzweb.be/08/braetj08/snake.html

それで、誰かが私のコードを変更して同じ速度で実行し続ける方法を教えてもらえますか?

function init_game() {
    if ((event ? event.keyCode : down) == (event ? 40 : 1)) /*down*/
    {
        if ((snakehead + z) < z * z) {
            right = 0;
            left = 0;
            up = 0;
            down = 1;
            document.getElementsByClassName(snakehead, "div", document)[0].id = "gamebox";
            snakehead = snakehead + z;
            document.getElementsByClassName(snakehead, "div", document)[0].id = "gameboxsnake";
        } else {
            document.write("<h1>game over!</h1> press this button to try again.<br><input     type='button' value='retry'     onclick='window.open(\"http://www.dbzweb.be/08/braetj08/snake.html\",\"_self\")'>");
        }
    }
    if ((event ? event.keyCode : up) == (event ? 38 : 1)) /*up*/
    {
        if ((snakehead - z) > -1) {
            right = 0;
            left = 0;
            up = 1;
            down = 0;
            document.getElementsByClassName(snakehead, "div", document)[0].id = "gamebox";
            snakehead = snakehead - z;
            document.getElementsByClassName(snakehead, "div", document)[0].id = "gameboxsnake";
        } else {
            document.write("<h1>game over!</h1> press this button to try again.<br><input    type='button' value='retry'    onclick='window.open(\"http://www.dbzweb.be/08/braetj08/snake.html\",\"_self\")'>");
        }
    }
    if ((event ? event.keyCode : right) == (event ? 39 : 1)) /*right*/
    {
        if ((snakehead + 1) % z !== 0) {
            right = 1;
            left = 0;
            up = 0;
            down = 0;
            document.getElementsByClassName(snakehead, "div", document)[0].id = "gamebox";
            snakehead = snakehead + 1;
            document.getElementsByClassName(snakehead, "div", document)[0].id = "gameboxsnake";
        } else {
            document.write("<h1>game over!</h1> press this button to try again.<br><input     type='button' value='retry'   onclick='window.open(\"http://www.dbzweb.be/08/braetj08/snake.html\",\"_self\")'>");
        }
    }
    if ((event ? event.keyCode : left) == (event ? 37 : 1)) /*left*/
    {
        if (snakehead % z !== 0) {
            right = 0;
            left = 1;
            up = 0;
            down = 0;
            document.getElementsByClassName(snakehead, "div", document)[0].id = "gamebox";
            snakehead = snakehead - 1;
            document.getElementsByClassName(snakehead, "div", document)[0].id = "gameboxsnake";
        } else {
            document.write("<h1>game over!</h1> press this button to try again.<br><input   type='button' value='retry' onclick='window.open(\"http://www.dbzweb.be/08/braetj08/snake.html\",\"_self\")'>");
        }
    }
    t = 0;
    t = setTimeout("init_game()", 100);
}
4

1 に答える 1

3
t = 0;
t = setTimeout("init_game()", 100);

これはあなたが思っていることをしません。これにより、変数tが0に設定され(これによりタイムアウトがクリアされません)、すぐにtimeoutIDから返された値に設定されsetTimeoutます。

キーが押されるたびinit_gameに再度実行されるため、スネークは高速化しています。これにより、すべての呼び出しを再度実行するタイムアウトの量が増加しますinit_game

に変更t = 0;してみてくださいclearTimeout(t)。ただし、コードの前に宣言する必要がありtます(先頭に追加var t;)。

また、文字列をに渡さないでください。setTimeoutを使用しますeval。関数を渡します。

clearTimeout(t);
t = setTimeout(init_game, 100);

注:ループを停止するためにdocument.write("<h1>game over!</h1>追加する必要があります(そして、無限の「ゲームオーバー!」メッセージを出力します)。return;init_game

デモ:http://jsfiddle.net/T5kPg/1/

于 2012-05-16T20:51:33.840 に答える