游戏对象的旋转制造滑步partern代替圆形(Game object rotation making

2019-10-16 17:55发布

我在java中做了一个简单的游戏动画。 这三颗行星绕轴旋转。 每个行星是类的实例, Planet和它们所具有的,每次它运行的更新方法,轨道的旋转角度增大,位置更新acording的角度和一些预定的变量,如从“太阳”的距离。 在这里,您可以确定与简单的三角函数行星的位置。 在这种情况下:

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);
    }
}

下面是测试星球类的类。 您可以下载它需要从这里工作的罐子: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);
    }
} 

Answer 1:

你的旋转设置为0在上面,所以我假设你不转动,此刻的图片。 我认为正在发生的事情是,你正在生产的轨道圈是好的,但要绘制行星的位置是关闭的。

下面是摇摆将如何绘制圆形的图像,让你体验的重叠是因为这个原因。

您需要调整您绘制由如何一半的宽度,它位于在轨道上的圆心位置。

编辑:你已经改变了一些代码,但你需要改变的是他的星球的绘制方法:

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


Answer 2:

你可能你的结果比较,这AnimationTest使用相同的圆的参数方程 。 因为轨道半径是封闭面板的尺寸的函数,所述轨道是圆形的,只有当w等于h 。 调整框架,或者设置HIGH = WIDE ,看到效果。



文章来源: Game object rotation making an eliptical partern instead of circular