LibGDX-调整大小后将粒子渲染到错误的位置

时间:2019-06-10 16:25:41

标签: java libgdx

目前我有2个屏幕,一个主菜单和一个战斗屏幕。当我直接从主菜单屏幕移到战斗屏幕而没有调整大小时,一切正常,但是当我调整主菜单的大小然后移到我的战斗屏幕时,粒子(仅粒子)的渲染不正确。

我尝试过:

-以战斗画面的show方法更新视口

将spritebatch的投影矩阵设置为mapcamera或unitcamera的摄像机组合。

-在渲染之前应用每个视口(有3个)。

主菜单屏幕

https://snag.gy/cJCnRt.jpg

private Stage _stage;

public MainMenuScreen(Object... params){
    _stage = new Stage();
    backgroundbatch = new SpriteBatch();
}

@Override
public void render(float delta) {
     backgroundbatch.begin();
     backgroundbatch.draw(_currentFrame, 0, 0,_stage.getViewport().getWorldWidth(),_stage.getViewport().getWorldHeight()); // Draw current frame at (0, 0)
     backgroundbatch.end();

    _stage.act(delta);
    _stage.draw();
}

@Override
public void resize(int width, int height) {
    _stage.getViewport().setScreenSize(width, height);
    //_stage.getViewport().update(width, height);
}

战斗画面类

private void initializeHUD() {
    _hudCamera = new OrthographicCamera();
    _hudCamera.setToOrtho(false, VIEWPORT.physicalWidth, VIEWPORT.physicalHeight);
}

@Override
public void show() {
    _camera = new OrthographicCamera();
    _camera.setToOrtho(false, map.getMapWidth(), map.getMapHeight());

    _mapRenderer = new OrthogonalTiledMapRenderer(_mapMgr.getCurrentTiledMap(), Map.UNIT_SCALE);
    _mapRenderer.setView(_camera);

    spritebatch = new SpriteBatch();
    map.makeSpawnParticles();
}

@Override
public void render(float delta) {
    _camera.update();
    _hudCamera.update();

    //draw particles
    ParticleMaker.drawAllActiveParticles(spritebatch, delta);

}

@Override
public void resize(int width, int height) {
    Player.getInstance().getEntityStage().getViewport().update(width, height, true);
    _playerBattleHUD.resize(width, height);
    map.getTiledMapStage().getViewport().update(width, height, true);
}

粒子经理类

public static void drawAllActiveParticles(SpriteBatch spriteBatch, float delta) {
    for (ArrayList<Particle> particleTypeList : allParticles.values()) {
        spriteBatch.begin();
        for(Particle particle : particleTypeList) {
            if(particle.isActive()) {
                particle.update(delta);
                particle.draw(spriteBatch,delta);
            }

            if (particle.isComplete()) {
                particle.delete();
                //particles.remove(particle);
            }
        }
        spriteBatch.end();
    }
}

PARTICLE CLASS

public void draw(SpriteBatch spriteBatch, float delta) {
    Gdx.app.debug("Particle : ", "spritebatch position = " + spriteBatch.getProjectionMatrix().getScaleX() + " , " + spriteBatch.getProjectionMatrix().getScaleY() + ")"); 
    particleEffect.draw(spriteBatch, delta);
}

预期结果: https://snag.gy/q2txr5.jpg(颗粒是黄点)

结果(在调整主屏幕大小之后): https://snag.gy/g81ZJ7.jpg

值得注意:在调整大小后,与未调整主菜单大小相比,spritebatch projectionmatrix显示不同的值。

1 个答案:

答案 0 :(得分:0)

对于其他有类似问题的人,我使用tiledmaprenderer的批处理来渲染我的粒子,从而解决了问题。