Java Libgdx主体位置和shapenderer位置不相同

Java Libgdx主体位置和shapenderer位置不相同,java,camera,libgdx,shape-rendering,Java,Camera,Libgdx,Shape Rendering,一般来说,我对libgdx还比较陌生。基本上我有一个弹跳球的世界,我只是在尝试。在我拥有固定摄像机位置之前: 在渲染方法中放入以下行后,摄影机将继续跟随玩家(即圆): 这名球员属于体型 因此,当我这样做时,它确实跟随播放器,但形状渲染器现在的行为很奇怪。看看发生了什么: 尽管我指的是摄影机和形状渲染器的播放器的相同x和y位置,但它们不在同一位置 这是我的密码: public class Game extends ApplicationAdapter { World world = new

一般来说,我对libgdx还比较陌生。基本上我有一个弹跳球的世界,我只是在尝试。在我拥有固定摄像机位置之前:

在渲染方法中放入以下行后,摄影机将继续跟随玩家(即圆):

这名球员属于体型

因此,当我这样做时,它确实跟随播放器,但形状渲染器现在的行为很奇怪。看看发生了什么:

尽管我指的是摄影机和形状渲染器的播放器的相同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() {  
}  

}

您只需设置ShapeRenders projectionmatrix一次,因此渲染时它不会更新

你应该把

shapeRenderer.setProjectionMatrix(camera.combined);
在开始之前添加到渲染方法

 shapeRenderer.begin(ShapeType.Filled);
 shapeRenderer.begin(ShapeType.Filled);