LibGDX移动相机

时间:2015-02-26 18:42:09

标签: camera libgdx

我目前正在小型平台游戏中工作,我的相机运动出现问题。首先,当我的角色y位置大于我的屏幕尺寸时,我的屏幕尺寸为900x400我想改变相机位置。这是我更新相机的方式

    public void updateCamera(){
            leftButton.x = player1.getHitBox().x - 380;
            spriteLeftButton.setPosition(leftButton.x, 20);

            rightButton.x = player1.getHitBox().x - 280;
            spriteRightButton.setPosition(rightButton.x, 20);

            jumpButton.x = player1.getHitBox().x + 312;
            spriteJumpButton.setPosition(jumpButton.x, 20);

            camera.position.x = player1.getHitBox().x;

        if(player1.getHitBox().getY() > Gdx.graphics.getHeight()){ // update camera 
            updateCameraY = true;
        }else{
            updateCameraY = false;
        }
        if(updateCameraY){
            camera.position.y = player1.getHitBox().y;

        }else{
            camera.position.y = 200;
        }
            camera.update();
        }

我也有Android设备的控件,所以这里有一些来自我游戏的图片 enter image description here enter image description here enter image description here 所以当我的角色的位置更高时,我得到了一些奇怪的结果。我的对手消失了。

3 个答案:

答案 0 :(得分:2)

用2个摄像头渲染你的游戏真好。

  1. 一个用于渲染游戏对象,缩放,移动旋转等。
  2. 第二个用于渲染游戏控制,得分等。
  3. 您可以为gui使用像素完美渲染的事实是这种方法的优势之一。
  4. 快速样本:

    gameBatch.setProjectionMatrix(gameCamera.combined);
    gameBatch.begin();
    sprite.draw(gameBatch);
    gameBatch.end();
    guiBatch.setProjectionMatrix(controlsCamera.combined);
    guiBatch.begin();
    sprite.draw(guiBatch);
    guiBatch.end();
    

答案 1 :(得分:1)

您的标题和按钮正在移动的事实是因为它们被设置为静态位置

解决此问题的一种快速方法是获取相机位置,然后根据相机位置放置图像和文字

实现这一目标的更好方法是使用按钮 首先声明皮肤 您需要了解如何创建.json文件和纹理Atlas here是一个很好的教程

我将为你的"死亡"标签

做一个例子

private Stage stage = new Stage(); private Skin skin = new Skin(Gdx.files.internal("UI/uiskins.json"), new TextureAtlas(Gdx.files.internal("UI/uiskins.atlas"))); private Label label = new Label("Deaths", skin); private Table table = new Table();

在show()部分 您需要了解表的工作方式Here

table.center().top();
table.add(label).row();
table.setFillParent(true);

stage.addActor(table);

Gdx.input.setInputProcessor(stage);`

//And finally add this to where you want to update the death score
label.setText("Deaths: " + String.valueOf(yourDeathVariable));

希望你喜欢:)

答案 2 :(得分:1)

有两种方法可以实现这一目标。更简单的方法是在相机类中使用project()方法,它将您的世界/相机坐标转换为屏幕坐标。但是此方法将Vector3作为参数,因此您必须将UI坐标放入Vector3对象,然后将其传递给project()。下面是一个例子:

    Vector3 camCoords = new Vector3(posX, posY, 0);

posX和posY是button / gui元素的x和y坐标。因为我们只处理2d,所以最后的参数-z必须为零。现在我们可以得到 屏幕坐标:

    Vector3 screenCoords = camera.project(camCoords);
    buttonX = screenCoords.x;
    buttonY = screenCoords.y;

现在,如果您将在“buttonX”和“buttonY”处绘制元素,则元素将始终显示在屏幕上。

如果您不想使用上述方法:

您可以在不使用上述方法的情况下计算元素相对于相机位置的位置。您所要做的就是必须相对于相机而不是标准坐标来定位元素。下面是一些简单的数学运算,可以将标准坐标转换为摄像机坐标。

假设posX和posY是gui元素的x和y坐标。现在你必须计算相机的确切位置:

    float cameraX = camera.position.x;
    float cameraY = camera.position.x - (camera.viewportHeight/2);

position是Camera类中的Vector3。 camera.y会在屏幕中间返回一个值但是我们必须得到相机的底部,所以我们将减去视口的一半来做到这一点。现在,您所要做的就是将这些值添加到元素坐标中:

    float newPosX = posX + cameraX;
    float newPosY = posY + cameraY;

现在在这个newPosX和newPosY上绘制你的元素,它将始终坚持它的位置。