Donc, ce problème sévit depuis quelques jours maintenant. Tout d'abord, quelle est la différence entre dire Body.getWorldCenter () et Body.getPosition (). J'ai entendu dire que WorldCenter pourrait avoir à voir avec le centre de gravité ou quelque chose.
Deuxièmement, lorsque je crée un corps Box2D pour un sprite, le corps est toujours dans le coin inférieur gauche. Je le vérifie en imprimant un rectangle de 1 pixel autour du box.getWorldCenter (). D'après ce que je comprends, le corps devrait être au centre du sprite et sa boîte englobante devrait s'enrouler autour du sprite, n'est-ce pas?
Voici une image de ce que je veux dire (The Sprite is Red, Body Blue):
Voici du code:
Créateur de corps:
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;
}
Faire le Sprite:
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 );
}