我有一个用java制作的简单游戏动画。它是围绕轴旋转的三个行星。每个行星都是类Planet
的一个实例,它们有一个更新方法,每次运行时,轨道的旋转角度都会增加,位置会根据角度和一些预定的变量(如距离的距离)更新。 “太阳”。从这里,您可以使用简单的三角法确定行星的位置。在这种情况下:
Sin(angle) = op/hyp = y/distance
therefore
Sin(angle)*hyp = op
Cos(angle) = ady/hyp = x/distance
therefore
Cos(angle)*hyp = ady
其中,hypothenuse是到太阳的距离,adyacent和oposite边分别是x和y值。我认为这会起作用,直到我试了一下。它给了我一个椭圆机。以下是更新行星旋转的代码(轨道中心是太阳的中心位置):
position.x = ((Math.cos(orbitAngle) * orbitDistance) + orbitCenter.x);
position.y = ((Math.sin(orbitAngle) * orbitDistance) + orbitCenter.y);
可能出现什么问题?
修改
我通过将一个物体的中心放置在轨道中心指定的位置
来实现这个问题以下是星球的完整代码:
public class Planet
{
protected Image image;
protected Vector2 position;
protected final Vector2 orbitCenter;
protected float rotation;
protected Vector2 imageSize;
protected final float rotationSpeed;
protected final float orbitDistance;
protected float orbitAngle;
protected final float orbitAngleSpeed;
public Planet(Image image, float orbitDistance, float rotationSpeed, Vector2 orbitCenter, float orbitAngleSpeed)
{
this.image = image;
this.position = new Vector2(orbitCenter.x, orbitCenter.y - orbitDistance);
this.orbitCenter = orbitCenter;
this.rotation = 0;
this.imageSize = new Vector2(image.getWidth(null), image.getHeight(null));
this.rotationSpeed = rotationSpeed;
this.orbitDistance = orbitDistance;
this.isMouseOver = false;
this.isPressed = false;
this.orbitAngle = 0;
this.orbitAngleSpeed = orbitAngleSpeed;
}
public void Update()
{
orbitAngle += orbitAngleSpeed;
if(orbitAngle > Math.PI * 2)
orbitAngle %= Math.PI * 2;
position.x = ((Math.cos(orbitAngle) * orbitDistance) + orbitCenter.x);
position.y = ((Math.sin(orbitAngle) * orbitDistance) + orbitCenter.y);
}
public void Draw(Graphics2D g)
{
g.rotate(rotation, position.x + imageSize.x / 2, position.y + imageSize.y / 2);
g.drawImage(image, (int)position.x, (int)position.y, null);
g.rotate(-rotation, position.x + imageSize.x / 2, position.y + imageSize.y / 2);
}
}
这是测试星球类的类。你可以从这里下载它需要工作的jar:foxtailgames.net/AppletSource.jar。这是测试人员类(你可能需要导入一些东西但是如果你在eclipse或netbeans中它会给你导入的话):
public class PlanetTest extends AppletCore
{
public void resizeScreen() {resize(800, 800);}
Image center;
Planet p;
public void LoadContent()
{
p = new Planet(loadImage("images/GameMenuCircles/Planet1.png"), 100f, 0.02f, new Vector2(400, 400), 0.005f);
center = loadImage("images/GameMenuCircles/Center.png");
}
public void Update(GameTime gameTime)
{
p.Update();
}
public void Draw(Graphics2D g, GameTime gameTime)
{
g.drawImage(center, 400 - center.getWidth(null)/2, 400 - center.getWidth(null)/2, null);
p.Draw(g);
g.setColor(Color.green);
g.drawLine(400, 400, 500, 400);
g.drawLine(400, 400, 400, 500);
g.drawLine(400, 400, 300, 400);
g.drawLine(400, 400, 400, 300);
g.setColor(Color.white);
}
}
答案 0 :(得分:3)
您的旋转在上面设置为0,所以我假设您此刻不旋转图片。我认为正在发生的是你正在生产的轨道圆是好的,但你正在绘制地球的位置是关闭的。
下面是Swing如何绘制圆圈的图像,因此您遇到的重叠是因为这一点。
你需要调整绘制圆圈的位置,使其宽度的一半,使其位于轨道中心之上。
编辑:你改变了一些代码,但你需要改变的是他的行星的绘制方法:
public void Draw(Graphics2D g) {
g.rotate(rotation, position.x + imageSize.x / 2, position.y + imageSize.y / 2);
g.drawImage(image, (int)position.x, (int)position.y, null); //here
g.rotate(-rotation, position.x + imageSize.x / 2, position.y + imageSize.y / 2);
}
这一行必须是:
g.drawImage(image, (int)position.x - imageSize.width, (int)position.y - imageSizee.height, null); //here
答案 1 :(得分:2)
您可以将结果与使用相同AnimationTest
的parametric equation of a circle进行比较。由于轨道半径是封闭面板尺寸的函数,因此仅当w
等于h
时,轨道才是圆形的。调整框架大小,或设置HIGH = WIDE
,以查看效果。