java - Libgdx body 位置和 shaperrenderer 位置不一样

标签 java camera libgdx shape-rendering

总的来说,我对 libgdx 还很陌生。基本上我有球弹跳世界,我只是在试验它。在我有这样一个固定的相机位置之前:

http://prntscr.com/567hvo

在我将以下行放入渲染方法后,相机会一直跟随玩家(即圆圈):

camera.position.set(player.getPosition().x, player.getPosition().y, 0); 

玩家是 Body 类型。

所以当我这样做时它确实会跟随玩家,但形状渲染器现在表现得很奇怪。看看会发生什么:

http://prntscr.com/567i9a

尽管我指的是玩家相对于摄像机和形状渲染器的相同 x 和 y 位置,但它们并不处于相同位置。

这是我的代码:

public class Game extends ApplicationAdapter {

World world = new World(new Vector2(0, -9.8f), true);  
Box2DDebugRenderer debugRenderer;  
OrthographicCamera camera;  
static final int PPM = 100;
static float height,width;
Body player;
RayHandler handler;
PointLight l1;

ShapeRenderer shapeRenderer;

@Override  
public void create() {     
    shapeRenderer = new ShapeRenderer();

    height = Gdx.graphics.getHeight();
    width = Gdx.graphics.getWidth();

    //set camera
     camera = new OrthographicCamera();  
     camera.setToOrtho(false, (width)/PPM/2, (height)/PPM/2);
     camera.update();  

     //Ground body  
     BodyDef groundBodyDef =new BodyDef();  
     groundBodyDef.position.set(new Vector2(width/PPM/2/2, 0));  
     Body groundBody = world.createBody(groundBodyDef);  
     PolygonShape groundBox = new PolygonShape();  
     groundBox.setAsBox((width/PPM/2/2), 0.1f);  
     groundBody.createFixture(groundBox, 0.0f);  

     //wall left
     BodyDef wallLeftDef = new BodyDef();
     wallLeftDef.position.set(0, 0f);
     Body wallLeftBody = world.createBody(wallLeftDef);

     PolygonShape wallLeft = new PolygonShape();
     wallLeft.setAsBox(width/PPM/20/2, height/PPM/2);
     wallLeftBody.createFixture(wallLeft,0.0f);

     //wall right
     BodyDef wallRightDef = new BodyDef();
     wallRightDef.position.set((width/PPM)/2, 0f);
     Body wallRightBody = world.createBody(wallRightDef);

     PolygonShape wallRight = new PolygonShape();
     wallRight.setAsBox(width/PPM/20/2, height/PPM/2);
     wallRightBody.createFixture(wallRight,0.0f);



     //Dynamic Body  
     BodyDef bodyDef = new BodyDef();  
     bodyDef.type = BodyType.DynamicBody;  
     bodyDef.position.set((width/PPM)/2/2, (height / PPM)/2/2);  
     player = world.createBody(bodyDef);  
     CircleShape dynamicCircle = new CircleShape();  
     dynamicCircle.setRadius(5f/PPM);  
     FixtureDef fixtureDef = new FixtureDef();  
     fixtureDef.shape = dynamicCircle;  
     fixtureDef.density = 0.4f;  
     fixtureDef.friction = 0.2f;  
     fixtureDef.restitution = 0.6f;  
     player.createFixture(fixtureDef);  
     debugRenderer = new Box2DDebugRenderer();  

     //Lighting

     handler = new RayHandler(world);
     handler.setCombinedMatrix(camera.combined);
     PointLight l1 = new PointLight(handler,5000,Color.CYAN,width/PPM/2,width/PPM/2/2/2,height/PPM/2/2);

     new PointLight(handler,5000,Color.PURPLE,width/PPM/2,width/PPM/2/1.5f,height/PPM/2/2);


     shapeRenderer.setProjectionMatrix(camera.combined);

}  


public void update() { 
    if(Gdx.input.isKeyJustPressed(Keys.UP)) { 
        player.applyForceToCenter(0, 0.75f, true);
    }
    if(Gdx.input.isKeyJustPressed(Keys.RIGHT)) { 
        player.applyForceToCenter(0.5f, 0f, true);
    }
    if(Gdx.input.isKeyJustPressed(Keys.LEFT)) { 
        player.applyForceToCenter(-0.5f, 0f, true);
    }

}



@Override  
public void dispose() {  
}  

@Override  
public void render() {   



     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);  
     debugRenderer.render(world, camera.combined);  
     world.step(1/60f, 6, 2); 
     handler.updateAndRender();




     shapeRenderer.begin(ShapeType.Filled);
     shapeRenderer.setColor(1, 1, 1, 1);
     shapeRenderer.circle(player.getPosition().x, player.getPosition().y, 5f/PPM, 100);
     shapeRenderer.end();

    camera.position.set(player.getPosition().x, player.getPosition().y, 0); 

    camera.update();
    update();


}  

@Override  
public void resize(int width, int height) {  




}  

@Override  
public void pause() {  
}  

@Override  
public void resume() {  
}  

最佳答案

您只设置一次 shapeRenderers projectionmatrix,因此它不会在您渲染时更新。

你应该把

shapeRenderer.setProjectionMatrix(camera.combined);

在你的渲染方法之前

 shapeRenderer.begin(ShapeType.Filled);

关于java - Libgdx body 位置和 shaperrenderer 位置不一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26926671/

相关文章:

java - 问题: Attempt to invoke virtual method 'double android. location.Location.getLatitude()

java - 无法测试 Cassandra executeAsync 响应

java - 测试和继承问题

iphone - Audio Session 属性监听器在 UIImagePickerController 中自动停用?

libgdx - 正确处理 LibGDX AssetManager

java - 如何保护 libgdx 函数 fromJson 免受错误输入的影响?

java - 如何在 JPA 和 Hibernate 中从具有大量子项的 @ManyToMany 关系中删除子对象

ffmpeg rtsp 记录段和文件夹-文件名

c++ - OpenGL 第三人称相机

java - 网格上的纹理不渲染,只显示黑色 libgdx gl20