У меня есть три прямоугольных блока: наземный блок, синий блок, блок героя. Земля размещается внизу экрана, синий блок лежит на наземном блоке, а блок героя падает на синий блок. У меня есть слушатель, который определяет, когда герой касается земли. Возможны две ситуации: 1) Когда герой падает с небольшой высоты на синий блок, его ок слушатель уведомляет, что герой касается только синего блока. 2) Когда герой падает с немного большей высоты, слушатель синего блока уведомляет, что герой касается земли !!! Как решить эту проблему?
Это прослушиватель Hero 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;
}