Написать правильный код.
Динамические тела в бокс2д точно контактируют со статичекими и с кинетическими.
Вот этот код мне вообще не понятен:

Код AS3:
contact.GetFixtureA().GetBody().GetUserData()[1]=="coin"
Зачем там [1]? Точнее, зачем вообще туда передавать массив? Чаще всего в качестве пользовательских данных передается ссылка на экземпляр класса.
В общем, вот пример того, как у меня проверяется столкнулся ли солдат с чем либо:

Код AS3:
override public function BeginContact(contact:b2Contact):void {
contact.FlagForFiltering();
var aFixture: b2Fixture = contact.GetFixtureA();
var bFixture: b2Fixture = contact.GetFixtureB();
var aBody: b2Body = aFixture.GetBody();
var bBody: b2Body = bFixture.GetBody();
if (bBody.GetUserData() is ISoldier) {
bBody.GetUserData().enabled = false;
bBody.GetLinearVelocity().NegativeSelf();
} else if (aBody.GetUserData() is ISoldier) {
aBody.GetUserData().enabled = false;
aBody.GetLinearVelocity().NegativeSelf();
}
}
А вот так назначаются пользовательские данные:

Код AS3:
public function build(x:Number, y:Number, radius:Number, world:b2World, userData:ISoldier, ratio:Number = 30):void {
_ratio = ratio;
_world = world;
var shape: b2CircleShape = new b2CircleShape(radius / _ratio);
var circleBodyDef: b2BodyDef = new b2BodyDef();
var circleFixtureDef: b2FixtureDef = new b2FixtureDef();
circleFixtureDef.isSensor = false;
circleFixtureDef.shape = shape;
circleFixtureDef.filter.maskBits = ~CategoryBits.PASS_THRU;
_direction = new b2Vec2(x / _ratio, y / _ratio);
circleBodyDef.position.Set(_direction.x, _direction.y);
_body = world.CreateBody(circleBodyDef);
_body.SetType(b2Body.b2_dynamicBody);
_body.CreateFixture(circleFixtureDef);
_body.SetLinearDamping(10);
_body.SetAngularDamping(10);
_body.SetUserData(userData); // передается класс, применяющий интерфейс ISoldier
}