2

デモ

HTML5キャンバスで「ヘビ」ゲームを作ろうとしています。しかし、私はヘビを正しい方向に動かすのに問題があります。次のコードでは、ヘビが0度と180度で水平に移動し、90度と270度で垂直に移動すると想定しますが、そうではありません。私はここで何が間違っているのですか?(左矢印と右矢印を使用してナビゲートします)。

function move(direction) {
    if(direction == left) {
         angel = (angel - 5) % 360;
        if(angel < 0) angel += 360;
    } else if (direction == right) {
        angel = (angel + 5) % 360;
    }
    x = x + Math.floor(Math.cos(angel*0.0174532925)*5);
    y = y + Math.floor(Math.sin(angel*0.0174532925)*5);

    $("#infoBar").html("Direction: " + direction +  " angel: " + angel);

    drawPoint(x,y);
}

乗数はもちろん放射度です。しかし、私が想定したように、どういうわけか270度は直線の垂直線ではありません。私は何が間違っているのですか?

Javascriptファイル。

HTMLファイル。

4

2 に答える 2

6

浮動小数点演算のため。

cos(270度) = 0

ブウアウト:

Math.cos((Math.PI/180)*270)ありません0。それは:-1.836909530733566e-16

つまり、-0.000000000000000183 などです。ゼロに非常に近いですが、ゼロよりわずかに小さいです。

しかし、あなたは を使用してMath.floorおり、Math.floorその数 (またはさらに言えばMath.floor(-0.1)) = -1 です。

あなたはそれを望んでいません。

Math.roundの代わりに使用しMath.floorます。

これがあなたのために修正されたライブの例です:http://jsfiddle.net/UtPJz/3/

于 2011-12-12T18:06:04.847 に答える
1

私はコード セグメントをコンパイルしていませんが、次のようなことができます。

function move(direction) {
    switch(direction)
    {
        case RIGHT:
            stepX = 1;
            stepY = 0;
            break;
        case LEFT:
            stepX = -1;
            stepY = 0;
            break;
        case UP:
            stepX = 0;
            stepY = -1;
            break;
        case DOWN:
            stepX = 0;
            stepY = 1;
            break;
    }

    x += stepX;
    y += stepY;
    drawPoint(x,y);
}
于 2011-12-12T18:10:32.337 に答える