2011-12-21 15 views
3

現在、境界ボックスを使用してスプライトを立体的に見せるのに問題があります。衝突は以下のコードで正常に動作します。2D境界ボックスの衝突、壁

位置は地図上の主要な文字の位置です。 character2は、メインキャラクタが衝突する18×28スプライトの名前です。

メインキャラクタがcharacter2スプライトと衝突すると、それに応じて位置を調整しようとしましたが(EX:Position.X - = 1;)、これは交差しなくなるまでメインスプライトをスライドさせます。

私はそれが何か非常に単純だと感じていますが、私の人生のために、私はそれを理解できません。

私の質問を要約すると、どのようにしてキャラクタ2のスプライトを衝突時に立体的に見せることができますか?

また、私のメインスプライトが衝突(速度を0に減らすことによって)で停止しても、そこにはまってしまうif文が無限ループに入ります。

 float x1 = Position.X; 
     float y1 = Position.Y; 

     float x2 = x1 + character2.Width; 
     float y2 = y1 + character2.Height; 

     BoundingBox b1 = new BoundingBox(new Vector3(x1, y1, 0), 
      new Vector3(x2, y2, 0)); 
     BoundingBox b2 = new BoundingBox(new Vector3(Position2.X, Position2.Y, 0), 
      new Vector3(x2, y2, 0)); 


     if (Collision(b1, b2)) 
     { 
      // ???? 
     } 

答えて

1

それはあなたが正確に起こるしたいのかに依存しますが、1つの提案は、このようなものです...

if (HorizontalCollision(b1, b2)) 
    { 
    xv = -xv; 
    } 
    else if (VerticalCollision(b1, b2)) 
    { 
    yv = -yv; 
    } 

    Position2.X += xv; 
    Position2.Y += yv; 

xvyv、この場合には、速度変数になると、あなたは、単に反転しています水平方向または垂直方向の衝突が発生しているときの方向です。これにより、オブジェクトまたは文字が文字通り互いに跳ね返ります。

次に、モーダルと摩擦をシミュレートするすべてのレンダリングループの後に速度が遅くなるようにxv *= .99とを追加することができます。このような速度変数を使用すると、さまざまな可能性が開かれます。ちなみに、これはEuler integrationと呼ばれ、アニメーションの目的では非常に効率的です。

0
While(Collision(b1, b2)) 
{ 
    Position.X -=1; 
} 

これは何ですか? :P

+0

ちょうど画面がフリーズする= X –

関連する問題