Сначала добавьте пользовательский прослушиватель контактов в ваш b2World.
public class Main
{
public function Main()
{
//init stuff
var cc:CustomContactListener = new CustomContactListener();
world.setContactListener(cc);
}
}
//then on hit call the hit function on sprite
public class CustomContactListener extends b2ContactListener
{
//Called when a contact point is added.
public override function Add(point:b2ContactPoint):void
{
//checks if the first shape is a sprite and second is a wall if true call Hit
if (point.shape1.GetBody().GetUserData().isSprite && point.shape2.GetBody().GetUserData().isWall)
{
point.shape1.GetBody().GetUserData().Hit();
}
else if (point.shape2.GetBody().GetUserData().isSprite && point.shape1.GetBody().GetUserData().isWall)
{
point.shape2.GetBody().GetUserData().Hit();
}
}
}
public class Sprite
{
public var hit:Boolean = false;
//Set hit to true and start applying realistic downward force
public function Hit()
{
hit = true;
}
//Enter frame event that applies force
public function step(e:Event)
{
if (hit)
{
b2Vec2 force = new b2Vec2(0, -9.8);
bodyOfSprite.ApplyLinearForce(force);
}
}
}
Это зависит от того, что вы установили пользовательские данные всех ваших тел в качестве класса, в котором они хранятся.т.е. спрайт, стена.Вы также можете сделать это противоположным образом, где вы постоянно применяете гравитацию, а также применяете противодействующую силу.Затем, когда вы вступаете в контакт со стеной, вы прекращаете применять другую силу, и сила тяжести вступает в силу.
Или, как @ iforce2d, просто проверяет, когда линейная скорость тела спрайта близка или равна нулю, потому чтоэто указывало бы на то, что он ударил что-то, что остановило его, не только стену, тогда вы можете просто установить для удара значение true.И функция шага сделает все остальное.Это ограничено, хотя, потому что это только должно замедлить это, чтобы вызвать это, не ударит стену, которая может быть нежелательна.