在地图上绘制一个精灵而不是屏幕

Exi*_*kle 2 java camera sprite libgdx

我正在使用libgdx,我有一个平铺地图,我想将精灵绘制到.然而精灵被绘制到实际窗口上,所以当我移动相机时,精灵停留在同一个地方.?我希望精灵在地图上移动.

这就是我目前渲染我的对象的方式

    @Override
    public void render(float delta) {
        translateCamera();

        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

        camera.update();

        renderer.setView(camera);

        renderer.render(bgLayers);
        batch.begin();

        batch.draw(splayerSprite, Gdx.graphics.getWidth() / 2,
                Gdx.graphics.getHeight() / 2);

        batch.end();
        renderer.render(fgLayers);

    }
Run Code Online (Sandbox Code Playgroud)

它总是最终位于屏幕的中间,但是我希望能够将它们分开移动,例如带有(W,A,S,D)的摄像机,并使用方向键移动我的播放器.然后,如果我想让相机锁定到播放器,但其他方面是免费的.

我是libgdx的新手所以请耐心等待,谢谢

Wil*_*son 6

问题是SpriteBatch投影矩阵没有设置为Camera投影矩阵.这意味着Sprite没有相对于Camera.这就是相机移动的原因,但精灵不是; 没有使用正确的矩阵.

此外,精灵的渲染时间始终为屏幕宽度的一半,也是屏幕高度的一半.修复此调用sprite.draw.这将使用Sprite的内部位置.

SpriteBatch通过batch.setProjectionMatrix(camera.combined)设置投影矩阵.这将导致精灵相对于相机渲染.

@Override
public void render(float delta) {
    translateCamera();

    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    camera.update();

    renderer.setView(camera);

    renderer.render(bgLayers);

    //here's the line that was missing.
    batch.setProjectionMatrix(camera.combined);
    batch.begin();

    //be sure to call this instead of specifying position yourself!
    splayerSprite.draw(batch);
    batch.end();
    renderer.render(fgLayers);

}
Run Code Online (Sandbox Code Playgroud)

每当按下WASD时,你仍然需要处理将相机的位置捕捉​​到精灵的位置,但这是微不足道的.

//snap the camera to the sprite's center.
if(wasd_isDown){
    float centerX = sprite.getX()+sprite.getWidth()/2;
    float centerY = sprite.getY()+sprite.getHeight()/2;
    camera.position.set(x,y, 0);
}
Run Code Online (Sandbox Code Playgroud)

如果按下方向键,只需通过Vector3.add翻译相机的位置矢量,如下所示:

if(!wasd_isDown){
    float deltaX = 0;
    float deltaY = 0;
    float MOVE_DIST = 10;//or whatever you need.

    if(leftPressed) deltaX = -MOVE_DIST;
    else if(rightPressed) deltaX = MOVE_DIST;

    if(upPressed)deltaY = MOVE_DIST;
    else if(downPressed)deltaY = -MOVE_DIST;

    camera.position.add(deltaX, deltaY, 0);
}
Run Code Online (Sandbox Code Playgroud)

这将允许摄像机仅在玩家使用方向键时独立移动,并允许精灵相对于摄像机的方向进行渲染.当按下WASD时,它还会立即将相机拍摄回精灵.