2013-12-16 3 views
1

Я играю с libgdx для создания еще одной игры физики :), и я нашел что-то странное. А именно, я использую SpriteBatch для рендеринга изображений одновременно с Box2DDebugRenderer для отладки.Box2DDebugRenderer и SpriteBatch неуместны

Но когда физика действует, они кажутся неуместными. Я писал:

public class Canon implements ApplicationListener { 
    private OrthographicCamera camera; 
private Box2DDebugRenderer debugRenderer; 

    /... 
public void create() {    
    camera = new OrthographicCamera(CAMERA_WIDTH, CAMERA_HEIGHT); 
    world = new World(new Vector2(0f, -9.8f), true); 
     camera.position.set(CAMERA_WIDTH/2, CAMERA_HEIGHT/2, 0f); 
     camera.update();   
    debugRenderer = new Box2DDebugRenderer(); 
    spriteBatch = new SpriteBatch(); 
     //Create a canon. A rectangle :) 
     bd = new BodyDef(); 
    fd = new FixtureDef(); fd.density = 1; 
    PolygonShape ps = new PolygonShape(); 

    // Cannon 
    bd.type = BodyDef.BodyType.StaticBody; 
    bd.position.set(new Vector2(8, 5)); 
    ps.setAsBox(5f, 1f); 
    cannonBody = world.createBody(bd); 
    fd.shape = ps; 
    cannonBody.createFixture(fd); 
    } 

@Override 
public void render() {  
    Gdx.gl.glClearColor(0, 0, 0, 1); 
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 

    debugRenderer.render(world, camera.combined); 
    world.step(BOX_STEP, BOX_VELOCITY_ITERATIONS, BOX_POSITION_ITERATIONS); 
     spriteBatch.begin(); 
     Sprite s = (Sprite)targetBody1.getUserData(); 
     spriteBatch.draw(s.getTexture(), 
      (targetBody1.getPosition().x - bodyWidth/2)*ppuX,   (targetBody1.getPosition().y - bodyheight/2)*ppuY, 
      0f, 0f, bodyWidth*ppuX, bodyheight*ppuY, 1f, 1f, radToGrad*targetBody1.getAngle(), 0, 0, s.getTexture().getWidth(), s.getTexture().getHeight(), false, false); 
    spriteBatch.end(); 

} 
} 

enter image description here

А вот как это выглядит после enter image description here

Есть идеи?

Спасибо!

+1

Вы обновили свой SpriteBatch, чтобы использовать ту же камеру, что и с DebugRenderer? –

+0

Привет, Роб, за ваш ответ. Я сделал это debugRenderer.render (world, camera.combined); Но, как вы указываете, SpriteBatch не знает о камере (матрице). –

ответ

1

Я нашел его. Это связано с тем, что повороты в OpenGL выполняются в нижнем левом углу, тогда как вращения в Box2D выполняются вокруг тела центра масс. Вращение текстуры вокруг тела центра масс дает правильное физическое/текстурное поведение.

+2

Если это ваш ответ, пожалуйста, примите его, чтобы удалить этот вопрос из списка неотвеченных вопросов, – Sinkingpoint

+0

Уверен, как это делается? Это не автоматический ответ, если я скажу ответ? –

+2

Нажмите галочку рядом с вашим ответом. – Sinkingpoint

Смежные вопросы