1

我有三个矩形块:地面块,蓝色块,英雄块。地面放置在屏幕底部,蓝色块放在地面块上,英雄块下降到蓝色块。我有侦听器,可以检测英雄何时触地。有两种情况: 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

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

我建议使用 debug draw 来检查您所看到的是否真的是物理引擎中正在发生的事情。

于 2011-08-19T02:58:46.473 回答
0

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

于 2011-08-20T13:50:40.227 回答