1

キャンバスゲームのスプライトを、衝突するまで常にプレーヤーに向かって移動させようとしています。これを行う関連関数は次のupdate()関数です。

Enemy.prototype.update = function(playerX, playerY) {
    // Rotate the enemy to face the player
    this.rotation = Math.atan2(this.y - playerY, this.x - playerX) - 2.35;

    // Move in the direction we're facing
    this.x += Math.sin(this.rotation) * this.speed;
    this.y += Math.cos(this.rotation) * this.speed;
}

this.x、、およびはthis.y、それぞれ敵のX位置、Y位置、回転、および速度です。this.rotationthis.speed

それは一種の動作ですが、敵はプレーヤーから約300ピクセル離れてから、左に向きを変えてプレーヤーから離れ始め、プレーヤーに向かってきた方向から90度の角度で移動します。

これは説明が難しいので、問題を示すのに役立つ簡単なビデオを録画しました:http ://www.screenr.com/AGz7

敵はオレンジ色のスプライトで、プレイヤーは白いスプライトです。

敵をプレイヤーに向かって動かすために私が行っている計算にはどのような問題がありますか?

4

1 に答える 1

2

以前に角度/移動コードを記述したことから、これらはエラーである可能性があります。

それ以外の this.rotation = Math.atan2(this.y - playerY, this.x - playerX) - 2.35;

しますか

this.rotation = Math.atan2(playerY - this.y, playerX - this.x);

あなたに正しい回転を与えますか?

理由:魔法の定数を使用しないでください。数式が間違っている理由を理解してください。

それ以外の

this.x += Math.sin(this.rotation) * this.speed;
this.y += Math.cos(this.rotation) * this.speed;

試す

this.x += Math.cos(this.rotation) * this.speed;
this.y += Math.sin(this.rotation) * this.speed;

理由:角度が0 =東ベースの場合(そして数学ライブラリ関数を使用する場合はデフォルトで)、角度0の場合、水平方向の動きを最大にし、垂直方向の動きは必要ありません-cos(0)= 1およびsin(0) =0。

于 2013-03-13T02:21:07.863 に答える