Так что эта проблема была братской уже пару дней. Прежде всего, в чем разница, скажем, между Body.getWorldCenter () и Body.getPosition (). Я слышал, что WorldCenter может быть связан с центром тяжести или чем-то еще.
Во-вторых, когда я создаю Box2D Body для спрайта, Body всегда находится в левом нижнем углу. Я проверяю это, печатая прямоугольник в 1 пиксель вокруг box.getWorldCenter (). Из того, что я понимаю, Тело должно быть в центре Спрайта, и его ограничительная рамка должна обернуться вокруг Спрайта, верно?
Вот изображение того, что я имею в виду (Спрайт красный, синее тело):
Вот некоторый код:
Создатель тела:
public static Body createBoxBody( final World pPhysicsWorld, final BodyType pBodyType,
final FixtureDef pFixtureDef, Sprite pSprite ) {
float pRotation = 0;
float pCenterX = pSprite.getX() + pSprite.getWidth() / 2;
float pCenterY = pSprite.getY() + pSprite.getHeight() / 2;
float pWidth = pSprite.getWidth();
float pHeight = pSprite.getHeight();
final BodyDef boxBodyDef = new BodyDef();
boxBodyDef.type = pBodyType;
//boxBodyDef.position.x = pCenterX / Constants.PIXEL_METER_RATIO;
//boxBodyDef.position.y = pCenterY / Constants.PIXEL_METER_RATIO;
boxBodyDef.position.x = pSprite.getX() / Constants.PIXEL_METER_RATIO;
boxBodyDef.position.y = pSprite.getY() / Constants.PIXEL_METER_RATIO;
Vector2 v = new Vector2( boxBodyDef.position.x * Constants.PIXEL_METER_RATIO, boxBodyDef.position.y * Constants.PIXEL_METER_RATIO );
Gdx.app.log("@Physics", "createBoxBody():: Box Position: " + v);
// Temporary Box shape of the Body
final PolygonShape boxPoly = new PolygonShape();
final float halfWidth = pWidth * 0.5f / Constants.PIXEL_METER_RATIO;
final float halfHeight = pHeight * 0.5f / Constants.PIXEL_METER_RATIO;
boxPoly.setAsBox( halfWidth, halfHeight ); // set the anchor point to be the center of the sprite
pFixtureDef.shape = boxPoly;
final Body boxBody = pPhysicsWorld.createBody(boxBodyDef);
Gdx.app.log("@Physics", "createBoxBody():: Box Center: " + boxBody.getPosition().mul(Constants.PIXEL_METER_RATIO));
boxBody.createFixture(pFixtureDef);
boxBody.setTransform( boxBody.getWorldCenter(), MathUtils.degreesToRadians * pRotation );
boxPoly.dispose();
return boxBody;
}
Создание Спрайта:
public Car( Texture texture, float pX, float pY, World world ) {
super( "Car" );
mSprite = new Sprite( texture );
mSprite.setSize( mSprite.getWidth() / 6, mSprite.getHeight() / 6 );
mSprite.setPosition( pX, pY );
mSprite.setOrigin( mSprite.getWidth()/2, mSprite.getHeight()/2);
FixtureDef carFixtureDef = new FixtureDef();
// Set the Fixture's properties, like friction, using the car's shape
carFixtureDef.restitution = 1f;
carFixtureDef.friction = 1f;
carFixtureDef.density = 1f; // needed to rotate body using applyTorque
mBody = Physics.createBoxBody( world, BodyDef.BodyType.DynamicBody, carFixtureDef, mSprite );
}