3

さて、私はプレイヤーが何人かの敵に追われている javascript/html キャンバス ゲームを作りたいと思っています。少し「調査」した後、彼女は私のモンスター (敵) クラスの最も重要な部分です。

  this.UpdateAngle = function() {
    this.dx = this.x - player.x;
    this.dy = this.y - player.y;
    this.angle = Math.atan2(this.dy, this.dx) * 180 / Math.PI;
    if (this.angle < 0) {
      this.angle += 2 * Math.PI;
    }
  }
  this.UpdateSpeed = function() {
    this.speedX = this.speed * Math.cos(this.angle);
    this.speedY = this.speed * Math.sin(this.angle);
  }
  this.Move = function() {
    this.UpdateAngle();
    this.UpdateSpeed();
    this.x += this.speedX;
    this.y += this.speedY;
  }

つまり、ここでやろうとしていたのは、敵からプレイヤーまでの角度を計算し、 と を使用しatan2()て x 軸と y 軸でどれだけ移動する必要があるかを計算することでした。速度と角度を計算して、移動しただけです。計算されたピクセル。cos()sin()

プレイヤーを動かすまでは、これはすべてうまく機能しているように見えますが、敵は奇妙な方向に動き始めます。何が悪いのかわかりません。これがどのように行われるのかを誰かが教えてくれたら最高です。:D

ここで実際の動作を見ることができます。*PremierBromanov の提案でコードを更新しました。

4

2 に答える 2

2

このブロックと関係があるかもしれません

this.angle = Math.atan2(this.dy,this.dx) * 180 / Math.PI;
    if (this.angle < 0) {
      this.angle += 2 * Math.PI;

whichを使用Math.atan2して角度をラジアンで出力し、次に で度に変換して* 180 / Math.PI;います。その後、それがゼロより小さいかどうかを確認し、角度に 2Pi を追加して、完全な円の実際の角度を正しく計算していることを確認します。マイナス角度。ただし、ここでは度の代わりにラジアンを使用しています。したがって、コードが負の場合、2Pi を次数に追加することになります。これはそれほど多くはありませんが、正になることがあります。これが、移動時にドットが回転する理由です。気が付くと、遠くにいるとドットの回転が遅くなります。これは、負の角度が 2Pi よりも大きく、すぐには回転しないことを意味します。

要するに、これに変更してみてください

if (this.angle < 0) {
      this.angle += 360;
    }
于 2014-12-17T19:52:11.897 に答える
1

わかりました、実際にこれに答えたのはブロマノフ首相でした、ありがとう、しかし私はコメントを受け入れることができません. 私が行った計算は少し間違っていました。私のコードは次のようになりました。

this.UpdateAngle = function() {
  this.dx = player.x - this.x;
  this.dy = player.y - this.y;
  this.distance = Math.sqrt((this.dx*this.dx) + (this.dy*this.dy));
  this.angle = Math.atan2(this.dy,this.dx) * 180 / Math.PI;
}
  this.UpdateSpeed = function() {
  this.speedX = this.speed * (this.dx/this.distance);
  this.speedY = this.speed * (this.dy/this.distance);
}
this.Move = function() {
  this.UpdateAngle();
  this.UpdateSpeed();
  this.x += this.speedX;
  this.y += this.speedY;
}

ブロマノフ首相に再び感謝します。これが彼の回答です。また、他のすべての人にも感謝します。これは私の最初の投稿であり、応答がどれほど早く得られたかをうれしく思います。(私はここで一番遅かったです) :D

于 2014-12-23T00:33:40.730 に答える