0

私は宇宙船を持っています。その宇宙船は空間を 360 度移動します。

宇宙船には 2D の推力アニメーションが必要です。トラスト アニメーションは、宇宙船の中央下部に配置する必要があります。次の変数があります。

_Rotation
_Spaceship.width
_Spaceship.height
_Spaceship.Position(x,y)

人々が私の悪い説明を理解していない場合に備えて、私の問題の画像もアップロードしました。

http://imgur.com/Lgchc

どちらのアニメーションも次のようにレンダリングされます。

this._itemAnimation.render(this.getPosition(), canvas, this._degrees);
this._thrustAnimation.render(this.thrustPosition(), canvas, this._degrees);

私はこれまで試してみましたが失敗しました:

_thurstPosition.set(((int)_object_x + Math.cos(_degrees) * _itemAnimation.getWidth() / 2) , 
((int)_object_y + Math.sin(_degrees) * _itemAnimation.getWidth() / 2));

私は失敗しました、誰か助けてください。

- - アップデート - -

コードを更新して、よりよく理解できるようにしました。

    int SpaceshipCenterX = getPosition().x + (_SpaceshipAnimation.getWidth() / 2) - (_thrustAnimation.getWidth() / 2);
    int SpaceshipCenterY = getPosition().y + ((_SpaceshipAnimation.getHeight() / 2) - (_thrustAnimation.getHeight() / 2));

    double OffSetCos = Math.cos(_spaceshipDegrees);
    double OffSetSin = Math.sin(_spaceshipDegrees);

    _thurstPosition.set 
    (
        (int)(SpaceshipCenterX + (SpaceshipAnimation.getWidth() / 2) * OffSetCos)
        ,
        (int)(SpaceshipCenterY + (SpaceshipAnimation.getHeight() / 2) * OffSetSin)
    );

私はまだそれをうまくやり遂げることができません。宇宙船の周りを回っていますが、非常に速く、どこでも点滅しています。

--- 更新 2 ---

これはほとんど機能していますが、行き過ぎています:

    int xOffset = -1 * (_itemAnimation.getWidth() / 2);
    double DegreeToRadien = Math.toRadians(_degrees);

    _thurstPosition.set
    (
        (int)(((xOffset) * Math.cos(DegreeToRadien)) + getPosition().x),
        (int)(((xOffset) * Math.sin(DegreeToRadien)) + getPosition().y)
    );
4

3 に答える 3

4

この座標/角度システムを使用していると仮定します。

                90 (pi/2) - Up
                     ^
                     |
Left - 180 (pi) <----|----> 0 - Right
                     |
                     v
            Down - 270 (3pi/2)

そして、あなたの宇宙船は 0 度で右に進んでいます

>[ } 0

次に、推力を宇宙船の中心から相対的に変換する必要がある任意の方向について、次のように x 方向に変換するとします。

offset = -1 * width/2;

次に、宇宙船の角度で回転させ、最後に宇宙船の位置で平行移動します。

この変換を計算するには、3 つの変換を行列として逆の順序で書き出し、それらを乗算して、(0,0) から始まる点を変換します。

   [1 0 spaceshipX] [cos(dir) -sin(dir) 0] [1 0 -width/2] [0]
   [0 1 spaceshipY] [sin(dir)  cos(dir) 0] [0 1     0   ] [0]
   [0 0     1     ] [   0         0     1] [0 0     1   ] [1]

したがって、推力の位置は次のようになります。

thrustX = (-width/2)cos(dir) + spaceshipX
thrustY = (-width/2)sin(dir) + spaceshipY

したがって、幅/2を足すのではなく、引く必要があるという事実を見逃したと思います。

これを、より読みやすい正しい構文で編集しました。あらゆる場所でアンダースコアを使用すると、読みやすさが大幅に低下します。宇宙船クラスがあり、宇宙船には幅、高さ、x 位置、y 位置、および回転があると想定しています。幅、高さ、x 位置、y 位置、および回転も持つスラスター クラスがあります。(Sprite 抽象クラスから継承できます)。スラスター オブジェクトの位置を設定するには、スラスター.setPosition(x,y); を呼び出します。

int xOffset = -1 * (spaceship.width / 2);

thruster.setPosition(
    (int)(((xOffset) * Math.cos(spaceship.rotation)) + spaceship.x), 
    (int)(((xOffset) * Math.sin(spaceship.rotation)) + spaceship.y)
);

これにより、どの値をどこに設定する必要があるかが明確になることを願っています。これらの変数が宣言されている場所と、それらが実際に何を意味するのか、コードをもっと見ずして解読することはできません。

アップデート

結論として、あなたが発見したかもしれないと思います。Math.cos と Math.sin では、角度を Degree ではなく Radians で指定する必要があります。ここで示した解決策は正しいものであり、行列計算を実行して相対的に配置されたオブジェクトの位置を計算する方法を示しました。spaceship.rotation はラジアン単位にするか、Math.cos() または Math.sin() に渡す前に度からラジアンに変換する必要があることを覚えておいてください。

int xOffset = -1 * (spaceship.width / 2);
double radians = Math.toRadians(spaceship.rotation);

thruster.setPosition(
    (int)(((xOffset) * Math.cos(radians)) + spaceship.x), 
    (int)(((xOffset) * Math.sin(radians)) + spaceship.y)
);
于 2012-04-04T20:58:26.980 に答える
1

あなたのコードは私に似ています。意味に注意が必要です_degrees。ロケットが指す方向 (+x 軸から反時計回り) の場合_degrees、推力はロケットの前面ではなく背面にあるため、そこにマイナス記号を入力する必要があります。また、推力はロケットの高さ端にあると思いますので、getLength代わりに を使用してgetWidthください。スラスト アニメーションの高さを追加する必要がある場合もあります (アンカーの位置によって異なります)。だから何か

_thurstPosition.set(((int)_object_x - Math.cos(_degrees) * (_itemAnimation.getHeight() / 2 + _thrustAnimation.getHeight() / 2)) , 
((int)_object_y - Math.sin(_degrees) * (_itemAnimation.getHeight() / 2 + _thrustAnimation.getHeight() / 2)));

円でない場合は、スラスト方向も設定する必要があります。

(私は_degrees==と仮定してい_Rotationます)

于 2012-04-04T19:56:23.897 に答える
0
double DegreeToRadien = Math.toRadians(_degrees);

    int ObjectXCenter = (int) (_object_x + ((_itemAnimation.getWidth() / 2)) - _thrustAnimation.getWidth() / 2);
    int ObjectYCenter = (int) (_object_y + ((_itemAnimation.getHeight() / 2)) - _thrustAnimation.getHeight() / 2);

    int xOffset = -1 * (_itemAnimation.getWidth() / 2);

    _thurstPosition.set
    (
        (int)(((xOffset) * Math.cos(DegreeToRadien)) + ObjectXCenter), 
        (int)(((xOffset) * Math.sin(DegreeToRadien)) + ObjectYCenter)
    );
于 2012-04-05T18:46:55.373 に答える