LibGDX 移动相机
LibGDX moving camera
我目前在小型平台游戏中工作,我的镜头移动有问题。首先,当我的角色 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 设备的控制器,所以这是我游戏中的一些图片
所以当我角色的 y 位置更高时,我得到了一些奇怪的结果。我的控件消失了。
最好用 2 个摄像头来渲染你的游戏。
- 一个用于渲染游戏对象,它缩放、移动旋转等
- 第二个用于呈现游戏控制、得分等
- 您可以为您的图形用户界面使用像素完美渲染这一事实是这种方法的优势之一。
快速示例:
gameBatch.setProjectionMatrix(gameCamera.combined);
gameBatch.begin();
sprite.draw(gameBatch);
gameBatch.end();
guiBatch.setProjectionMatrix(controlsCamera.combined);
guiBatch.begin();
sprite.draw(guiBatch);
guiBatch.end();
您的标题和按钮移开的事实是因为它们被设置为静态位置
解决这个问题的一种快速方法是获取相机位置,然后根据相机位置放置图像和文字
实现此目的的更好方法是使用按钮
首先声明皮肤
您需要了解如何创建 .json 文件和纹理图集
here 很好的教程
我会为你的"Deaths "标签
做一个例子
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));
希望你喜欢:)
有两种方法可以实现这一点。更简单的方法是在相机 class 中使用 project() 方法,这会将您的 world/camera 坐标转换为屏幕坐标。但此方法将 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 class 中的 Vector3。 camera.y 会 return 屏幕中间的一个值,但我们必须得到相机的底部,所以我们将减去一半的视口来做到这一点。现在您所要做的就是将这些值添加到您的元素坐标中:
float newPosX = posX + cameraX;
float newPosY = posY + cameraY;
现在在这个 newPosX 和 newPosY 上绘制你的元素,它会一直保持在它的位置。
我目前在小型平台游戏中工作,我的镜头移动有问题。首先,当我的角色 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 设备的控制器,所以这是我游戏中的一些图片
最好用 2 个摄像头来渲染你的游戏。
- 一个用于渲染游戏对象,它缩放、移动旋转等
- 第二个用于呈现游戏控制、得分等
- 您可以为您的图形用户界面使用像素完美渲染这一事实是这种方法的优势之一。
快速示例:
gameBatch.setProjectionMatrix(gameCamera.combined);
gameBatch.begin();
sprite.draw(gameBatch);
gameBatch.end();
guiBatch.setProjectionMatrix(controlsCamera.combined);
guiBatch.begin();
sprite.draw(guiBatch);
guiBatch.end();
您的标题和按钮移开的事实是因为它们被设置为静态位置
解决这个问题的一种快速方法是获取相机位置,然后根据相机位置放置图像和文字
实现此目的的更好方法是使用按钮 首先声明皮肤 您需要了解如何创建 .json 文件和纹理图集 here 很好的教程
我会为你的"Deaths "标签
做一个例子
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));
希望你喜欢:)
有两种方法可以实现这一点。更简单的方法是在相机 class 中使用 project() 方法,这会将您的 world/camera 坐标转换为屏幕坐标。但此方法将 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 class 中的 Vector3。 camera.y 会 return 屏幕中间的一个值,但我们必须得到相机的底部,所以我们将减去一半的视口来做到这一点。现在您所要做的就是将这些值添加到您的元素坐标中:
float newPosX = posX + cameraX;
float newPosY = posY + cameraY;
现在在这个 newPosX 和 newPosY 上绘制你的元素,它会一直保持在它的位置。