Farseer physics:碰撞检测问题

时间:2011-08-17 17:37:57

标签: box2d game-physics physics-engine farseer

我有三个矩形块:地块,蓝色块,英雄块。 地面位于屏幕底部,蓝色块位于地面块上,英雄块落入蓝色块。我有听众,可以检测到英雄被触地时。 有两种情况: 1)当英雄从低高度落到蓝色块时,其正确的倾听者通知英雄只接触蓝色块。 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;
    }

2 个答案:

答案 0 :(得分:0)

根据高度下降而不同的事实表明,英雄正穿透蓝色块接触地面。尝试将英雄块设置为子弹体,如果问题得到解决,那确实是这种情况。您还可以尝试蓝色块的高度,看看它是如何影响事物的。

我建议使用调试绘制来检查您所看到的内容是否真的发生在物理引擎中。

答案 1 :(得分:0)

我找到了解决问题的方法: 1)我将Farseer项目插入到我的解决方案中 2)在Settings.cs中找到了行      public const float AABBExtension = 0.1f; 3)将值更改为“0.01f”。它的工作原理!