1

私は宇宙ゲームを作っています。小さなドローン船を大きなプレイヤー船の軌道に乗せたいと思っています。完全な円で周回する方法が完全にはわかりません。今のところ、ひし形に動かすことはできますが、円の形に修正する試みは失敗に終わりました。

基本的に、私は次のようなことをしています:

float centerX = ship.getX() + (ship.getWidth() / 2);
float centerY = ship.getY() + (ship.getHeight() / 2);
float droneX = drone.getX();
float droneY = drone.getY();
float radius = drone.getRadius();
float xDiff = Math.abs(droneX - centerX);
float yDiff = Math.abs(droneY - centerY);
float moveByX = Math.abs(radius / (xDiff == 0 ? 1 : xDiff) / smoother);
float moveByY = Math.abs(radius / (yDiff == 0 ? 1 : yDiff) / smoother);

そして、moveByX と moveByY の値でドローンを動かします。先に述べたように、ひし形では問題なく動作しますが、これを改善して正しい円形パターンを計算するにはどうすればよいでしょうか?

4

2 に答える 2

5

さて、あなたはxとyの違いを使用しているので、それは直線にしか進まないでしょう。これはダイヤモンドのパターンを説明しています。円を取得するには、三角法を実行する必要があります。

float angle; //angle in radians
float droneX = drone.getRadius() * Math.sin(angle); 
float droneY = drone.getRadius() * Math.cos(angle);

その後、移動コードを使用できます。そして、角度はおそらくドローンとラジアンで維持する必要があります。

于 2012-08-21T20:08:47.833 に答える
2

CBredlow は、質問を解決するのに十分な情報を提供してくれました。コメントだったので、彼の回答を受け入れることができませんでしたが、解決策は次のとおりです。

// this is degrees per second
   float speed = 10f;
   float rate = 5f;
   float circleX = (float) (Math.cos(drone.getAngle()) * 
          (ship.getWidth() / 1.25) + centerX);
   float circleY = (float) (Math.sin(drone.getAngle()) * 
          (ship.getHeight() / 1.25) + centerY);
   float angle = drone.getAngle() + (speed * (rate/1000)) % 360;
   if (angle >= 360) {
      angle = 0;
   }
   drone.setAngle(angle);
   drone.setX(circleX);
   drone.setY(circleY);

ありがとう!

于 2012-08-21T20:04:03.657 に答える