1

Javaで作成した簡単なゲームアニメーションがあります。軸を中心に回転する 3 つの惑星です。各惑星はクラスのインスタンスであり、Planet実行されるたびに軌道の回転角度が増加し、角度と「太陽」からの距離などのいくつかの事前定義された変数に従って位置が更新される update メソッドがあります。ここから、単純な三角法で惑星の位置を決定できます。この場合:

Sin(angle) = op/hyp = y/distance
therefore
Sin(angle)*hyp = op

Cos(angle) = ady/hyp = x/distance
therefore
Cos(angle)*hyp = ady

ここで、仮説は太陽までの距離であり、隣接側と反対側はそれぞれ 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);
    }
} 
4

2 に答える 2

3

上記では回転が0に設定されているため、現時点では画像を回転させていないと思います。私が考えているのは、作成している軌道円は問題ありませんが、惑星を描いている場所がずれています。

以下は、Swing がどのように円を描画するかのイメージです。重複が発生するのは、このためです。

軌道の中心に収まるように、円を描く位置を幅の半分だけ調整する必要があります。

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
于 2012-05-18T03:35:37.453 に答える
2

あなたの結果を、円AnimationTestの同じパラメトリック方程式を使用するこれと比較するかもしれません。軌道半径は囲んでいるパネルの寸法の関数であるため、軌道は がw等しい場合にのみ円形になりhます。フレームのサイズを変更するかHIGH = WIDE、 を設定して効果を確認します。

アニメーションテスト

于 2012-05-18T01:45:32.467 に答える