Box2dweb запретить движение
Теперь я создал объект в box2d, и я перемещаю его с помощью ввода с клавиатуры. Далее я хотел бы остановить вертикальное движение, которое может иметь это тело. Другими словами, он должен иметь возможность перемещаться влево и вправо, но не вверх и вниз, даже когда произошло столкновение с другим объектом.
Мой код для создания коробки:
var fixDef2 = new b2FixtureDef;
fixDef2.density = 1.0;
fixDef2.friction = 0.5;
fixDef2.restitution = 0.2;
var bodyDef2 = new b2BodyDef;
bodyDef2.type = b2Body.b2_dynamicBody;
fixDef2.shape = new b2PolygonShape;
fixDef2.shape.SetAsBox(
50/30 + 0.1 //half width
, 6/30 + 0.1 //half height
);
bodyDef2.position.x = Math.random() * 10;
bodyDef2.position.y = Math.random() * 10;
bodyDef2.fixedRotation = true;
bodies["player"]=world.CreateBody(bodyDef2);
bodies["player"].CreateFixture(fixDef2);
var direction = new b2Vec2(-100,0);
Ввод с клавиатуры:
$("body").keydown(function (e) {
switch(e.which){
case 37:{ left = true; break; }
case 38:{ up=true; break; }
case 39:{ right=true; break; }
case 40:{ down = true; break; }
}
});
$("body").keyup(function (e) {
switch(e.which){
case 37:{ left = false; break; }
case 38:{ up=false; break; }
case 39:{ right=false; break; }
case 40:{ down = false; break; }
}
});
и моя функция обновления, куда перемещается поле с именем "player" в массиве тел
if(left){
var direction = new b2Vec2(-100,0);
bodies["player"].ApplyForce( direction , bodies["player"].GetPosition() );
}
if(right){
var direction = new b2Vec2(100,0);
bodies["player"].ApplyForce( direction , bodies["player"].GetPosition() );
}
Поэтому я хочу запретить все вертикальные движения, которые могут происходить на моем теле ["игрок"], как бы я это сделал?
Сейчас я использую призматическое соединение, но при попытке сделать одно из тел статическим телом возникает ошибка:
var pj = new b2PrismaticJointDef();
pj.bodyA = bodies["left"];
pj.bodyB = bodies["player"];
pj.collideConnected = true;
prismaticJoint = world.CreateJoint(pj);
Создание тел ["левых"]:
bodyDef.type = b2Body.b2_staticBody;
fixDef.shape = new b2PolygonShape;
fixDef.shape.SetAsBox(2, 14);
bodyDef.position.Set(-1.8, 13);
bodies["left"] = world.CreateBody(bodyDef).CreateFixture(fixDef);
1 ответ
Использование b2_kinematicBody
скорее, чем b2_dynamicBody
,
Что-то вроде:
var con_body_def = new b2BodyDef;
con_body_def.type = b2Body.b2_kinematicBody;
con_body_def.position.y = con_bmp.y / SCALE;
con_body_def.position.x = con_bmp.x / SCALE;
var con_fix = new b2FixtureDef;
con_fix.restitution = SETTINGS.CON_E;
con_fix.friction = SETTINGS.CON_FR;
con_fix.shape = new b2PolygonShape;
con_fix.shape.SetAsArray(get_shape());
con_fix.userData = 0;
var con_body = world.CreateBody(con_body_def);
con_body.CreateFixture(con_fix);
затем обновить свою позицию:
con_body.SetLinearVelocity(direction);
(посмотрите на game.js здесь для рабочего примера)