1

3 つの長方形のブロックがあります: グラウンド ブロック、ブルー ブロック、ヒーロー ブロックです。画面の下部に地面が配置され、青いブロックが地面ブロックの上に置かれ、ヒーロー ブロックが青いブロックに落ちています。ヒーローが地面に触れたことを検出するリスナーがあります。2 つの状況があります: 1) ヒーローが低い高さから青いブロックに落ちると、OK リスナーはヒーローが青いブロックだけに接触することを通知します。2) ヒーローが少し高いところから青いブロック リスナーに落ちると、ヒーローが地面に触れたことを通知します !!! この問題を解決するには?

これはヒーローの OnCollision リスナーです。

bool heroBody_OnCollision(Fixture fixtureA, Fixture fixtureB, Contact contact)
{

  Texture2D textureB = (Texture2D)fixtureB.UserData;
  string textureBName = ((string)textureB.Tag).ToLower();

  if (textureBName == "ground")
  { 
    OnHeroTouchedGround();
    return true;
   }
   else if (textureBName.Contains("blue"))
   {       
     OnHeroTouchedBlueBlock();
     return true;
   }

   return true;
}


    public HeroState GetHeroState()
    {
        ContactEdge contactEdge = null;

        if (heroBody != null) contactEdge = heroBody.ContactList;

        while (contactEdge != null)
        {
            if (heroBody.LinearVelocity == Vector2.Zero)
            {
                Texture2D textureA = (Texture2D)contactEdge.Contact.FixtureA.UserData;
                string textureAName = ((string)textureA.Tag).ToLower();
                Texture2D textureB = (Texture2D)contactEdge.Contact.FixtureB.UserData;
                string textureBName = ((string)textureB.Tag).ToLower();

                if (textureAName == "ground" || textureBName == "ground")
                    return HeroState.OnGroud;
                 else if (textureAName.Contains("blue") ||    textureBName.Contains("blue"))
                    return HeroState.OnHome;
            }

            contactEdge = contactEdge.Next;
        }

        return HeroState.Playing;
    }
4

2 に答える 2

0

問題を解決する方法を見つけました: 1) Farseer プロジェクトを自分のソリューションに接続しました 2) Settings.cs で行 public const float AABBExtension = 0.1f; を見つけました。3) 値を「0.01f」に変更。そしてそれは動作します!!!

于 2011-08-20T13:50:40.227 に答える
0

落とした高さによって違うということは、ヒーローが青いブロックを突き抜けて地面に触れていることを示唆しています。ヒーロー ブロックを弾丸のボディに設定してみてください。問題が修正された場合は、実際にそうでした。青いブロックの高さを試して、それが物事にどのように影響するかを確認することもできます.

デバッグ ドローを使用して、実際に物理エンジンで発生していることを確認することをお勧めします。

于 2011-08-19T02:58:46.473 に答える