2

XNA を使い始めたばかりで、基本的な 2D タイル ベースのエンジンを構築したいと考えています。

これまでのところ、私はすでにいくつかの車のステアリングの数学と取り扱いを行ってきましたが、まだ衝突はありません.

車を破壊可能にすることにしたので、壁にぶつかると車の領域がぶつかります。

写真

車の中央部分はそのままですが、左から相手の車が当たったときに、左側の「通常」の画像を左側からの「ぶつかった」画像に置き換えたいと思います。

私の問題は、今でも車のすべてのパーツをグループ化する方法がわからないことです(フロントライトとバックライトも追加されます)ので、運転するとすべてのパーツが次のようになります。

これまでのところ、次のような単純なCarおよびCarPartsクラスがあります。

public Car() {
    Vector2D Position;
    float Rotation;
    Vector2D Direction;
    Texture2D BaseTexture;
    List<CarParts> Parts;
}

public CarParts() {
    Vector2D RelativePosition;
    Texture2D Testure;
}

どこ:

List[0] = FrontPart;
List[1] = FrontLeftPart;
List[2] = FrontRightPart;
List[3] = LeftPart;
List[4] = RightPart;
List[5] = RearLeftPart;
List[6] = RearRightPart;
List[7] = ReartPart;

どのように私はそれらの子供たちをメインカーで動かすことができますか?

°編集:またはそれを実現する別の方法はありますか?

ご助力いただきありがとうございます !

4

3 に答える 3

3

を使用している場合、これを処理する方法は、 originパラメータをメソッド ( MSDNSpriteBatch )に慎重に設定することです。私が「スプライト」と言うこの回答では、単一の呼び出しを意味します。そのため、車は複数のスプライトで構成されます。DrawDraw

origin パラメータは、スプライトの位置、スケーリング、および回転が行われる原点を設定します。スプライトの境界の位置に原点を設定できます。

原点位置は、スプライトのソース矩形の左上隅を基準として解釈されます。(ソース矩形を指定しない場合、テクスチャ全体をカバーするソース矩形が想定されます)。原点は、ソース テクスチャのピクセルに一致する単位で指定されます。

そのため、車のさまざまな部分を構成する 9 つのテクスチャ (または、スプライト シートを使用している場合は 9 つのソース矩形) のリストを維持する必要があります。また、パーツごとに原点位置を記憶します。

各スプライトに設定する原点位置は になります(centre of car) - (top left of sprite)

自動車部品例

したがって、車の中央のスプライトの場合、長方形のほぼ中央になります。車の左上隅では、両方の軸で正になりますが、スプライトの境界を超えています。右下隅の場合、原点は両方の軸で負になるため、スプライト境界の外側になります。他の部分についても同様です。

次に、車を構成する 9 つのスプライトすべてを単純に描画します。それぞれが異なるソース長方形/テクスチャと原点を持っています。ただし、それぞれの位置、スケール、回転は同じです。

マトリックスなどをいじる必要はありません:)

于 2012-08-14T13:29:05.963 に答える
1

車を移動するときは、車の位置のみを更新してください。パーツのオフセットは同じままにする必要があります。スプライトを描画するときは、車の位置とパーツの相対位置を組み合わせます。例えば:

var partPosition = List[0].RelativePosition;
var position = Position + partPosition;

次に、長方形を使用して所定の位置に描画できます

var rectangle = new Rectangle(position.X, position.Y, partWidth, partHeight);

回転を適用するには、位置/長方形に適用する回転行列が必要です。XNA には、これを支援する Matrix クラスのヘルパー メソッドがあります ( http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.matrix_members.aspxを参照)。

行列とベクトルの数学に慣れていない場合は、最初にそれをブラッシュアップすることをお勧めします。

于 2012-08-14T11:56:27.993 に答える
0

車の位置と方向を表すマトリックスを使用できます。それをスプライトバッチに適用し、ローカル座標 (RelativePosition) を使用して描画することができます。

それ以外の場合は、マトリックス内の各パーツの変換を記述し、それを車のマトリックスとマルチプレイします。次に、各パーツの方向と位置を変換行列で乗算して、画面の位置に変換できます。

于 2012-08-14T11:53:32.877 に答える