Как использовать камеры LibGDX с отладочными отладчиками Box2D - PullRequest
6 голосов
/ 01 апреля 2012

Я пытаюсь использовать Box2D Debug Renderer вместе со своими спрайтами и телами LibGDX.Проблема, с которой я столкнулся, заключается в том, что Renderer рисует Box Box в центре экрана, а затем Sprite рисуется по умолчанию (0,0) в левом нижнем углу экрана.Когда я двигаю Car Sprite, и машина, и коробка отладки перемещаются, чтобы они не перекрывались.

Я знаю, что проблема с камерой, потому что я уже несколько дней балуюсь различными значениями камеры.Иногда они перекрываются, но затем Box2D Debug Body движется быстрее, чем Car Sprite.

Иногда корпус Box2D находится в том же положении, что и спрайт, но очень маленький.Я использую 2 камеры.Один, который составляет 720 x 480. Камера отладки в метрах, так что ее, 24 x 16.

Вот некоторый код, в котором может быть проблема (я использую сцены и актеров):

BattleScreen.java:

public void show() {
    battleStage = new Stage( 720, 480, false );
    // The Box2D Debug Renderer will handle rendering all physics objects for debugging
    debugRenderer = new Box2DDebugRenderer( true, true, true, true );
    debugCam = new OrthographicCamera( 24, 16 );
}
public void render() {

    // Set the Camera matrices
    battleStage.getCamera().update();       

    // Update the Physics World, use 1/45 for something around 45 Frames/Second for mobile devices
    physicsWorld.step( 1/45.0f, 8, 3 );     // 1/45 for devices 

    // Again update the Camera matrices and call the debug renderer
    //debugCam.update();
    debugRenderer.render( physicsWorld, debugCam.combined );

    // Update all Game Objects then Draw them
    battleStage.act(delta);
    battleStage.draw();
}

Car.java: (также актер)

public Car(Texture texture ) {
    super( "Car" ); 

    mSprite = new Sprite( texture );
    mSprite.setSize( 54, 105 );

    mSprite.setOrigin( mSprite.getWidth()/2, mSprite.getHeight()/2);    // set the origin to be at the center of the body

    FixtureDef carFixtureDef = new FixtureDef();
    mBody = Physics.createBoxBody( BodyType.DynamicBody, carFixtureDef, mSprite );
}

public static Body createBoxBody( final BodyType pBodyType, final FixtureDef pFixtureDef, Sprite pSprite ) {

    final BodyDef boxBodyDef = new BodyDef();
    boxBodyDef.type = pBodyType;

    // Temporary Box shape of the Body
    final PolygonShape boxPoly = new PolygonShape();
    final float halfWidth = pSprite.getWidth() * 0.5f / Consts.PIXEL_METER_RATIO;
    final float halfHeight = pSprite.getHeight() * 0.5f / Consts.PIXEL_METER_RATIO;
    boxPoly.setAsBox( halfWidth, halfHeight );  // set the anchor point to be the center of the sprite
    pFixtureDef.shape = boxPoly;

    final Body boxBody = BattleScreen.getPhysicsWorld().createBody(boxBodyDef);
    boxBody.createFixture(pFixtureDef);
    boxPoly.dispose();
    return boxBody;
}

И еще хуже.Это действительно усложняется, когда я пытаюсь заставить главную камеру следовать за машиной.

Ответы [ 2 ]

3 голосов
/ 02 апреля 2012

А как насчет battleStage.getCamera().combined? Комбинированный работал хорошо для меня.

0 голосов
/ 07 апреля 2012

Вы должны применить следующее утверждение, чтобы объединить тело с нарисованной текстурой. stage.setCamera (камера);

...