Camera LibGDX移动摄像机

Camera LibGDX移动摄像机,camera,libgdx,Camera,Libgdx,我目前在小型platformer游戏公司工作,我的相机移动有问题。首先,我的屏幕尺寸为900x400当我的角色y位置大于我的屏幕尺寸时,我想改变相机的位置。下面是我如何更新我的相机 public void updateCamera(){ leftButton.x = player1.getHitBox().x - 380; spriteLeftButton.setPosition(leftButton.x, 20);

我目前在小型platformer游戏公司工作,我的相机移动有问题。首先,我的屏幕尺寸为900x400当我的角色y位置大于我的屏幕尺寸时,我想改变相机的位置。下面是我如何更新我的相机

    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();
        }
我还有安卓设备的控制器,下面是我游戏中的一些图片
所以当我的角色的y位置较高时,我得到了一些奇怪的结果。我的控制失效。

使用两个摄像头渲染游戏很好

  • 一个用于渲染游戏对象,它可以缩放、移动和旋转等
  • 第二个用于渲染游戏控件、分数等
  • 这种方法的优点之一是可以为gui使用像素完美渲染
  • 快速样本:

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

    这是很好的渲染你的游戏与2个摄像头

  • 一个用于渲染游戏对象,它可以缩放、移动和旋转等
  • 第二个用于渲染游戏控件、分数等
  • 这种方法的优点之一是可以为gui使用像素完美渲染
  • 快速样本:

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

    标题和按钮正在移开是因为它们被设置为静态位置

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

    实现这一点的更好方法是使用按钮 先申报皮肤 您需要学习如何创建.json文件和纹理图集 这是一个很好的教程

    我会为你的“死亡”标签做个例子

    
    私有阶段=新阶段();
    私有皮肤=新皮肤(Gdx.files.internal(“UI/uiskins.json”),
    新的TextureAtlas(Gdx.files.internal(“UI/uiskins.atlas”);
    私有标签=新标签(“死亡”,皮肤);
    私有表=新表()

    在show()部分 你需要知道桌子是如何工作的


    希望您喜欢:)

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

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

    实现这一点的更好方法是使用按钮 先申报皮肤 您需要学习如何创建.json文件和纹理图集 这是一个很好的教程

    我会为你的“死亡”标签做个例子

    
    私有阶段=新阶段();
    私有皮肤=新皮肤(Gdx.files.internal(“UI/uiskins.json”),
    新的TextureAtlas(Gdx.files.internal(“UI/uiskins.atlas”);
    私有标签=新标签(“死亡”,皮肤);
    私有表=新表()

    在show()部分 你需要知道桌子是如何工作的


    希望你喜欢:)

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

        Vector3 camCoords = new Vector3(posX, posY, 0);
    
    posX和posY是按钮/gui元素的x和y坐标。因为我们只处理2d,所以最后一个参数-z必须为零。现在我们可以 屏幕坐标:

        Vector3 screenCoords = camera.project(camCoords);
        buttonX = screenCoords.x;
        buttonY = screenCoords.y;
    
        float newPosX = posX + cameraX;
        float newPosY = posY + cameraY;
    
    现在,如果您将在“buttonX”和“buttonY”处绘制元素,元素将始终显示在屏幕上

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

    可以计算图元相对于摄影机位置的位置,而无需使用上述方法。你所要做的就是,你必须定位你的元素相对于相机,而不是你的标准坐标。下面是一些将标准坐标转换为相机坐标的简单数学

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

        float cameraX = camera.position.x;
        float cameraY = camera.position.x - (camera.viewportHeight/2);
    
    位置是摄影机类中的矢量3。camera.y将在屏幕中间返回一个值,但我们必须得到相机的底部,因此我们将减去视口的一半。现在,您只需将这些值添加到元素坐标:

        Vector3 screenCoords = camera.project(camCoords);
        buttonX = screenCoords.x;
        buttonY = screenCoords.y;
    
        float newPosX = posX + cameraX;
        float newPosY = posY + cameraY;
    

    现在在这个newPosX和newPosY处绘制元素,它将始终保持其位置。

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

        Vector3 camCoords = new Vector3(posX, posY, 0);
    
    posX和posY是按钮/gui元素的x和y坐标。因为我们只处理2d,所以最后一个参数-z必须为零。现在我们可以 屏幕坐标:

        Vector3 screenCoords = camera.project(camCoords);
        buttonX = screenCoords.x;
        buttonY = screenCoords.y;
    
        float newPosX = posX + cameraX;
        float newPosY = posY + cameraY;
    
    现在,如果您将在“buttonX”和“buttonY”处绘制元素,元素将始终显示在屏幕上

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

    可以计算图元相对于摄影机位置的位置,而无需使用上述方法。你所要做的就是,你必须定位你的元素相对于相机,而不是你的标准坐标。下面是一些将标准坐标转换为相机坐标的简单数学

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

        float cameraX = camera.position.x;
        float cameraY = camera.position.x - (camera.viewportHeight/2);
    
    位置是摄影机类中的矢量3。camera.y将在屏幕中间返回一个值,但我们必须得到相机的底部,因此我们将减去视口的一半。现在,您只需将这些值添加到元素坐标:

        Vector3 screenCoords = camera.project(camCoords);
        buttonX = screenCoords.x;
        buttonY = screenCoords.y;
    
        float newPosX = posX + cameraX;
        float newPosY = posY + cameraY;
    

    现在,在这个newPosX和newPosY处绘制元素,它将始终保持其位置。

    在UI中使用第二个摄像头要简单得多。否则,您必须在摄影机移动时移动所有UI内容。一个专用的用户界面摄像头可以