まず、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に設定するだけです。ステップ関数が残りの処理を行います。これは制限されています。なぜなら、壁に衝突しないようにするためには遅くする必要があるからです。
ありがとうございます。 – Curnelious