我正在制作一个太空游戏,我想制作一个小型无人机飞船轨道我的更大的玩家船。我不完全确定如何使它成为一个完美的圆圈轨道。到目前为止,我可以让它以钻石形状移动,但是我想要修正圆形的尝试却以失败告终。
基本上,我正在做这样的事情:
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值移动无人机。正如我所提到的,它在钻石形状下工作得很好,但是如何改进它来计算正确的圆形图案呢?
答案 0 :(得分:5)
好的,既然你正在使用x和y的差异,那么它只会在一条直线上,这解释了钻石图案。为了获得圆圈,你必须打破三角学。
float angle; //angle in radians
float droneX = drone.getRadius() * Math.sin(angle);
float droneY = drone.getRadius() * Math.cos(angle);
之后,您可以使用移动代码。并且角度应该保持在无人机上,并且以弧度为单位。
答案 1 :(得分: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);
谢谢!