Физика дальновидности: проблемы обнаружения столкновений - PullRequest
1 голос
/ 17 августа 2011

У меня есть три прямоугольных блока: блок земли, синий блок, блок героя.Земля находится внизу экрана, синий блок лежит на наземном блоке, а геройский блок падает на синий блок.У меня есть слушатель, который определяет, когда герой касается земли.Есть две ситуации: 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 голосов
/ 20 августа 2011

Я нашел, как решить проблему: 1) Я подключил проект Farseer к своему решению 2) в Settings.cs нашел строку публичный константный поплавок AABBExtension = 0.1f; 3) Изменено значение на «0.01f». И это работает !!!

0 голосов
/ 19 августа 2011

Тот факт, что он отличается в зависимости от высоты, с которой он упал, говорит о том, что герой проникает сквозь синий блок и касается земли.Попробуйте установить блок героя как тело пули, если проблема устранена, то это действительно так.Вы также можете поэкспериментировать с высотой синего блока, чтобы увидеть, как он влияет на вещи.

Я рекомендую использовать отладку, чтобы убедиться, что то, что вы видите, действительно происходит в физическом движке.

...