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 回答