2

タンクトラックはタンクのいずれかの側にある必要があり、タンクは360回転に面することができます。これを説明する写真は次のとおりです。

http://imgur.com/ySFTk

現時点では、タンクトラックは水平方向にオフセットしているだけです。タンクのコアに沿って垂直方向にオフセットしようとしています(機能していません)。

これが私がこれまでにしたことです:

private void tracksPosition()
{
    _DegreeToRadien = Math.toRadians(_degrees);

    _ObjectXCenter = (int) (_object_x + ((_itemAnimation.getWidth() / 2)) - _trackAnimationLeft.getWidth() / 2);
    _ObjectYCenter = (int) (_object_y + ((_itemAnimation.getHeight() / 2)) - _trackAnimationLeft.getHeight() / 2);

    //For left track
    _xOffset = -1 * (_itemAnimation.getHeight() / 2);

    _trackLeftPosition.set
    (
        (int)(((_xOffset) * Math.cos(_DegreeToRadien / 2)) + _ObjectXCenter),
        (int)(((_xOffset) * Math.sin(_DegreeToRadien / 2)) + _ObjectYCenter)
    );

Xオフセットで動作しますが、何らかの理由で、奇妙になることなくYオフセットを理解することはできません。

//-------答え----------//私がこれをどのように行ったか疑問に思っているすべての人にとって、ここに答えがあります:

    //For left track

    //Decide how far away the track is from the tank
    _xOffset = _itemAnimation.getHeight() / 1.5;

    //Decide where the track is horizontally to the tank (Ie front, back)
    _DegreeToRadien = Math.toRadians(_degrees + 110);

    //Set the point of the track, takes the centre of the tank and adds the current position, cos and sin basically divide (though multiplication) the current position according to the direction the tank is facing.
    _trackLeftPosition.set
    (
        _ObjectXCenter + (int)(_xOffset * Math.cos(_DegreeToRadien))
        ,
        _ObjectYCenter + (int)(_xOffset * Math.sin(_DegreeToRadien))
    );
4

2 に答える 2

3

役立つ情報がもう少し必要ですが、次のようになります。

  1. 行列演算を使用することで、おそらくもう少し体系的にやりたいことができるでしょう。
  2. コード内のすべての変数にコメントを付けます。時々、これは物事が抽象化されたときにエラーを見つけるのに役立ちます。

編集:

このリンクは、原点を中心に点を回転させる方法を示しています。 http://en.wikipedia.org/wiki/Rotation_matrix

タンクのコンポーネントを原点を基準にした一連の頂点として表すと、すべてのポイントに体系的に回転を適用できます。次に、これらの点の間に線を引いて回転した形状を作成するのは簡単なことです。たとえば、戦車が正方形の場合、その頂点は(1,1)、(-1,1)、(-1、-1)、および(1、-1)にあると判断できます。あなたのトラックは似ていますが、おそらく左側のトラックは(-1、1.25)、(-1.25、1.25)、(-1.25、-1.25)、(-1、-1.25)でしょう。同じ回転行列は、それらすべてを適切に回転させます。それは原点を中心にそれらを回転させます。あなたが望むものではありませんが、それは始まりです。

次に、xy軸の平行移動を取得するには、タンクの全体的なXY座標のX座標とY座標を追加するだけです。

記憶を更新する時間がありませんが、少し大きいマトリックスでも翻訳できる可能性があります。したがって、ベース座標、回転、および目的の(x、y)が入力され、最終的なポイント座標が出力されます。

これはより複雑に見えるかもしれませんが、コードは小さくなり、エラーが発生しにくくなります。

于 2012-04-22T14:12:38.693 に答える
0

私がこれをどのように行ったか疑問に思っているすべての人にとって、ここに答えがあります:

    //For left track

    //Decide how far away the track is from the tank
    _xOffset = _itemAnimation.getHeight() / 1.5;

    //Decide where the track is horizontally to the tank (Ie front, back)
    _DegreeToRadien = Math.toRadians(_degrees + 110);

    //Set the point of the track, takes the centre of the tank and adds the current position, cos and sin basically divide (though multiplication) the current position according to the direction the tank is facing.
    _trackLeftPosition.set
    (
        _ObjectXCenter + (int)(_xOffset * Math.cos(_DegreeToRadien))
        ,
        _ObjectYCenter + (int)(_xOffset * Math.sin(_DegreeToRadien))
    );
于 2012-04-23T19:01:13.810 に答える