2011-06-18 7 views
1

私は水平に動く2つのスプライトを持っていて、壁に当たったときに自然落下する必要があります。 私はフレームごとにポジションを変更する簡単な方法でこれを行う方法を知っていますが、これは当然ではなく、おそらく正しい方法ではありません。sprites cocos2dに落ちる

速度とy軸が考慮されているときに、衝突を発見して落下させる方法がありますか?

私はちょうどbox2dまたはchipmunkでそれを行う簡単な方法を見つけることができませんでした。

どのような方向でも良いでしょう。 ありがとうございます。

答えて

2

まず、b2Worldにカスタムコンタクトリスナーを追加します。

public class Main 
{ 
     public function Main() 
     { 
      //init stuff 
      var cc:CustomContactListener = new CustomContactListener(); 
      world.setContactListener(cc); 
     } 
} 

//then on hit call the hit function on sprite 
public class CustomContactListener extends b2ContactListener 
{ 
     //Called when a contact point is added. 
     public override function Add(point:b2ContactPoint):void 
     { 
      //checks if the first shape is a sprite and second is a wall if true call Hit 
      if (point.shape1.GetBody().GetUserData().isSprite && point.shape2.GetBody().GetUserData().isWall) 
      { 
       point.shape1.GetBody().GetUserData().Hit(); 
      } 
      else if (point.shape2.GetBody().GetUserData().isSprite && point.shape1.GetBody().GetUserData().isWall) 
      { 
       point.shape2.GetBody().GetUserData().Hit(); 
      } 
     } 
} 


public class Sprite 
{ 
     public var hit:Boolean = false; 

     //Set hit to true and start applying realistic downward force 
     public function Hit() 
     { 
      hit = true; 
     } 

     //Enter frame event that applies force 
     public function step(e:Event) 
     { 
      if (hit) 
      { 
       b2Vec2 force = new b2Vec2(0, -9.8); 
       bodyOfSprite.ApplyLinearForce(force); 
      } 
     } 
} 

これは、保持しているすべてのボディのユーザーデータを保持することに依存します。スプライト、壁。あなたはまた、重力を常に適用し、反対の力を加える場合とは逆の方法で行うこともできます。それからあなたが壁に接触すると、他の力をかけることをやめ、重力が働きます。

@ iforce2dのように、スプライトの線速度がゼロに近いかどうかをチェックするだけで、壁だけでなく停止したものがヒットしたことを示すため、チェックできます。ヒットをtrueに設定するだけです。ステップ関数が残りの処理を行います。これは制限されています。なぜなら、壁に衝突しないようにするためには遅くする必要があるからです。

0

世界の正しい重力(box2Dの場合のb2World)だけを設定し、あなたの体の初期速度を設定する任意の物理エンジンを使用します。したがって、自然に落ちます

0

速度を自分で設定する場合は、自然に見えるようにしてください:) 速度の垂直部分を変更するのは良い考えではありません。ちょうどそのままにしてください:

b2Vec2 vel = body->GetLinearVelocity(); 
vel.x = ...; 
body->SetLinearVelocity(vel); 
+0

ありがとうございます。 – Curnelious

関連する問題