2009-03-25 10 views
1

フラッシュBOX2D質問(しかし、私は「フラッシュ」の部分は関係ないと思います)Box2D:オブジェクトが他のオブジェクトと衝突しなくなったことを検出する方法は?

文字 と

が想定地であるオブジェクトB、あるオブジェクトAが存在すると仮定キャラクターは地面に触れるときにのみ歩くことができます。

オブジェクトが別のオブジェクトに接触したときに検出できるボックス2d接触リスナーがあるため、文字が地面に接触したときに聞くために使用できます。しかし、キャラクターが地面に残っているかどうかはどうすれば分かりますか?

読んでいただきありがとうございます。

答えて

4

が地面

ある文字とオブジェクトB、あるオブジェクトAが、そこにあるとし、彼は地面に触れたときに、文字だけ を歩くことができると仮定します。あなたのオブジェクトAを仮定

はb2BodyはObjectAにと呼ばれ、 ObjectBにはObjectBに呼ばれる別b2Bodyであり、あなたの世界がm_worldと呼ばれています。もしobjectB が地面であるなら、私はそれが静的になる0の密度を持っていると思います。 objectAがobjectBの上にあるかどうかを確認するには、box2d単位の測定(1メートル= 30ピクセル)を使用することを意味する本体そのものか、userDataプロパティで設定したカスタムクリップへの参照を使用するかのいずれかを使用します。

2番目の利点は、通常のピクセル単位を使用していることです。中心に登録ポイントが0,0でないことに注意してください。ちょうどあなたがコメントし、再び更新読む

if((objectA.m_userData.y + objectA.m_userData.height*.5) < (objectB.m_userData.y-objectB.m_userData.height*.5)) trace('objectA is above ground'); 
else trace('objectB is on the ground'); 

:(あなたがm_world.Stepを呼び出す場合)

だから、あなたの更新のループであなたのようなものを持っているでしょう。

ステージ上の要素からx、y、幅、高さを取得し、box2dコードを生成するフラッシュのjsflコマンドを書き始めました。私はこれを単純なゲームにするために使った: http://www.disturbmedia.com/games/breakfast 他の誰かがすでにかなりの一貫性を持たせているので、私は車輪を再発明する必要はないようだ。

http://www.sideroller.com/wck/

をあなたが必要とするものである、より複雑な形状の定義のための配列を座標生成するようだ:。戻ったばかりのカルロスUlloaが同様BOX2Dについて少し話をして、彼はこの事を指摘しLFPUGからですこれはあなたの特定の質問に対する完全な答えではありませんが、それは忘れられない一歩です。

あなたの説明から、ゲームは本当に面白く聞こえます。更新してください:)

+0

私のフラッシュ内のオブジェクトが常に動いている:P彼らは行動をやり続ける何らかの生命体です..しかし、私は、彼らは地面の上にあるかどうかを知る必要がありますか否か。だから、スリープは地上の検出に役立ちません。あなたの答えをたくさんありがとうtho。 – Unreality

+0

あなたのコメントに基づいて私の回答を編集しました。お役に立てれば。 –

+0

Box2Dはピクセル単位を想定していません。 1ユニット!= 30ピクセル! – Zifre

1

連絡先リスナーには、Remove(b2ContactPoint)というメソッドがあります。このメソッドは、2つのボディがもはや接触していない物理エンジンによって呼び出されます。言い換えれば、彼らはもう接点がありません。その時点で、俳優である身体Aが浮いていないことを検出できます。

もう1つのクールな解決策は、俳優から地面にレイキャストすることです。それらの間の距離を確認すると、浮遊しているか歩いているかを知ることができます。この作品がほしいと思っています

1

私の解決策はグーフィーですが、これはしばらく前に解決しました。私は地面の密度、反発力、摩擦をいくつかの「魔法の」数字に設定しています。連絡先リスナーでは、それらの体のうちの1つがそれらの数字を持っているかどうかを確認し、他の体はスプライトです。

私が言ったように、それはグーフィーですが、私はまだ簡単に動作するものを見ていません。

1

質問をしてからbox2dのバージョンが変更されていると思います。

現在、地面の衝突を確認する一般的な方法は、衝突の「正常」の方向を確認することです。

もしそれが上向きなら、英雄が接地されていると仮定して歩くことができます。 BeginContactとEndContactがあるあなたの質問

の他の部分に答えるために

ヒーローが地面から離れる前にジャンプが2回以上発生するのを避けるためにジャンプするときに、私はひょっとすると英数字の変数を論理的に保存して追跡することがよくあります。

私はこれがいくつかの助けを願っています。

2

私はあなたがこのために探していたと思う:

override public function EndContact(contact:b2Contact):void 
     { 
      if (contact.GetFixtureA().GetBody().GetUserData() != null) 
      { 
関連する問題