当相机从开始视点

时间:2017-02-03 02:43:44

标签: java android libgdx

当游戏开始并且相机没有移动并且屏幕视图端口时,我在正确位置为我的敌人纹理绘制健康栏时遇到问题:

  

FitViewport(GameConfig.WIDTH / GameConfig.PPM,GameConfig.HEIGHT /   GameConfig.PPM,gameCam);

没有改变,酒吧正确地留在敌人身上,但是当玩家通过屏幕的一半并且相机开始跟随他时,即使敌人没有移动,酒吧也开始移动。

当玩家离敌人一定距离时,他们的行为设定为到达,他们追踪玩家也会导致健康栏进一步离开屏幕:here is the health bar off screen when the camera and enemies starts to move

public void drawHealthBar(SpriteBatch batch){
    batch.begin();
    batch.draw(wHB,
            (this.getX() * GameConfig.PPM) + 20, (this.getY() * GameConfig.PPM) + 35 ,
            (Gdx.graphics.getWidth() / 15) * wolfHealth, 8);
    batch.draw(gHB,
            (this.getX() * GameConfig.PPM) + 20, (this.getY() * GameConfig.PPM) + 35 ,
            (Gdx.graphics.getWidth() / 15) * 1, 8);
    batch.end();
}

wHBgHB是健康栏纹理区域, 有没有人知道为什么会发生这种情况?

这是我的Play Screen类中的渲染功能,其中每个狼人敌人的健康栏都被绘制出来:

public void render(float delta) {
    update(delta);
    Gdx.gl.glClearColor(1,0,0,1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    // render map
    renderer.render();

    // render map bodies
    //box2DDebugRenderer.render(world, gameCam.combined);

    game.getBatch().setProjectionMatrix(gameCam.combined);
    game.getBatch().begin();
    player.draw(game.getBatch());
    for(WolfBeast wolfBeast: wolfEnemies){
        wolfBeast.draw(game.getBatch());
    }
    for(WaterBlast waterBlast: waterBlasts) {
        waterBlast.draw(game.getBatch());
    }
    game.getBatch().end();

    hud.stage.draw();

    for(WolfBeast wolfBeast: wolfEnemies){

        if(wolfBeast.wolfHealth > .6)
            game.getBatch().setColor(Color.GREEN);
        else if(wolfBeast.wolfHealth > .2)
            game.getBatch().setColor(Color.ORANGE);
        else
            game.getBatch().setColor(Color.RED);

        wolfBeast.drawHealthBar(game.getBatch());
        game.getBatch().setColor(Color.WHITE);
    }

    if(Gdx.app.getType() == Application.ApplicationType.Android) {
        moveButtons.drawButtons();
    }


}

如果您需要更多信息,请告诉我,我会提供。 我认为问题在于我是如何使用PPM扩展我的世界的,有人可以告诉我发生了什么以及如何解决这个问题吗?

public void update(float dt){
    stateTimer += dt;
    int playerXpos = (int) player.pBody.getPosition().x;
    int wolfBodyXpos = (int) this.eBody.getPosition().x;
    //System.out.println("playerXpos: " + playerXpos + " " + "wolfXpos: " + wolfBodyXpos);
    if (abs(playerXpos - wolfBodyXpos) >= 3.5f) {
        Arrive<Vector2> arriveSB = new Arrive<Vector2>(entity, target)
                .setTimeToTarget(.01f)
                .setArrivalTolerance(2.5f)
                .setDecelerationRadius(100);
        entity.setBehavior(arriveSB);
    }
    else {
        entity.setBehavior(null);
    }

    setPosition(eBody.getPosition().x - getWidth() / 2, eBody.getPosition().y - getHeight() / 2);
    setRegion(getFrame(dt));
    entity.update(dt);
}

此外,当我注释掉能让相机跟随播放器并且相机无法移动的线条时,健康栏会正确地保持在敌人身上。它没有任何意义,不应该只在敌人移动时移动when camera movement is off

1 个答案:

答案 0 :(得分:0)

问题是我的投影矩阵。我使用不同的投影用于精灵和不同的身体,这就是为什么他们以不同的速度移动。这效果最好:

batch.draw(getFrame(dt),
            pBody.getPosition().x,pBody.getPosition().y,
            1,1,
            1, 1,
            1,1 ,
            0
            );

这对我有用:

public void drawHealthBar(SpriteBatch batch){
    batch.draw(wHB,
            eBody.getPosition().x - .4f,
            eBody.getPosition().y + .2f,
            .7f * wolfHealth, .12f
                );
    batch.draw(gHB,
            eBody.getPosition().x - .4f,
            eBody.getPosition().y + .2f,
            .7f, .12f
                );
}

根据资产规模和缩放比例调整值