Java 在libGDX中更改分辨率时如何保持平铺贴图的外观
我已经为我正在编程的2D游戏创建了一个测试平铺地图。一切都很好!,但是当我改变分辨率时,相机无法正确地适应屏幕 我有一个播放器精灵和平铺贴图,我使用的分辨率为1366x768,因为您可以正确地看到屏幕: 但当我更改分辨率时,例如640x480。如图所示,根据新的分辨率,播放器不适合: 播放器看起来更大了,但我想根据新的分辨率调整整个屏幕,包括所有精灵 我认为cam渲染有问题,但我不知道我能做些什么来解决它。摄像机正在跟踪玩家的移动,一切正常,但我想让屏幕游戏符合所选的分辨率 我会把我的一些代码放在这里,你可以看到: 以下是主要代码:Java 在libGDX中更改分辨率时如何保持平铺贴图的外观,java,camera,libgdx,tiled,tmxtiledmap,Java,Camera,Libgdx,Tiled,Tmxtiledmap,我已经为我正在编程的2D游戏创建了一个测试平铺地图。一切都很好!,但是当我改变分辨率时,相机无法正确地适应屏幕 我有一个播放器精灵和平铺贴图,我使用的分辨率为1366x768,因为您可以正确地看到屏幕: 但当我更改分辨率时,例如640x480。如图所示,根据新的分辨率,播放器不适合: 播放器看起来更大了,但我想根据新的分辨率调整整个屏幕,包括所有精灵 我认为cam渲染有问题,但我不知道我能做些什么来解决它。摄像机正在跟踪玩家的移动,一切正常,但我想让屏幕游戏符合所选的分辨率 我会把我的一些代
public class codeTiled implements ApplicationListener {
... //Variables.....
public void create() {
manager = new AssetManager();
manager.setLoader(TiledMap.class, new TmxMapLoader());
manager.load("C:/Users/HOME/Desktop/tilemap/TiledMap/data/maps/test.tmx", TiledMap.class);
manager.finishLoading();
map = manager.get("C:/Users/HOME/Desktop/tilemap/TiledMap/data/maps/test.tmx", TiledMap.class);
batch=new SpriteBatch();
float w = Gdx.graphics.getWidth();
float h = Gdx.graphics.getHeight();
camera = new OrthographicCamera(50, 50 * (h / w));
float unitScale = 1 / 8f;
renderer = new OrthogonalTiledMapRenderer(map, unitScale);
player=new playerEx(100, 100, camera);
}
public void render() {
handleInput();
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
camera.update();
renderer.setView(camera);
renderer.render();
batch.begin();
player.render(batch);
batch.end();
}
private void handleInput() {
if (Gdx.input.isKeyPressed(Input.Keys.ESCAPE)){
System.exit(0);
}
camera.zoom = MathUtils.clamp(camera.zoom, 0.1f, 100/camera.viewportWidth);
float effectiveViewportWidth = camera.viewportWidth * camera.zoom;
float effectiveViewportHeight = camera.viewportHeight * camera.zoom;
camera.position.x = MathUtils.clamp(camera.position.x, effectiveViewportWidth / 2f, 100 - effectiveViewportWidth / 2f);
camera.position.y = MathUtils.clamp(camera.position.y, effectiveViewportHeight / 2f, 100 - effectiveViewportHeight / 2f);
}
这是我的玩家课程的一部分:
public class playerEx {
...//Variables....
public playerEx(int x, int y, OrthographicCamera camera){
this.camera=camera;
recP= new Rectangle();
recP.height = 64;
recP.width = 64;
recP.x = x;
recP.y = y;
imagen=new Texture(Gdx.files.internal("C:/Users/HOME/Desktop/tilemap/TiledMap/data/sprites/player/minigunattack.png"));
imagen2=new Texture(Gdx.files.internal("C:/Users/HOME/Desktop/tilemap/TiledMap/data/sprites/player/minigunstand.png"));
TextureRegion[][] tmp=TextureRegion.split(imagen,
imagen.getWidth()/5,imagen.getHeight());
imagen1=new Texture(Gdx.files.internal("C:/Users/HOME/Desktop/tilemap/TiledMap/data/sprites/player/feet.png"));
TextureRegion[][] tmp1=TextureRegion.split(imagen1,
imagen1.getWidth()/5,imagen1.getHeight());
movPlayer=new TextureRegion[5];
movFeet=new TextureRegion[5];
for(int i=0;i<5;i++){
movFeet[i]=tmp1[0][i];
}for(int i=0;i<5;i++){
movPlayer[i]=tmp[0][i];
}animationAttack=new Animation(0.08f,movPlayer);
animationFeet=new Animation(0.10f,movFeet);
tiempo=0f;
}
公共类playerEx{
…//变量。。。。
公共播放器REX(int x、int y、正交摄影机){
这个。照相机=照相机;
recP=新矩形();
recP.height=64;
recP.width=64;
recP.x=x;
记录y=y;
imagen=新纹理(Gdx.files.internal(“C:/Users/HOME/Desktop/tilemap/tilemap/data/sprites/player/minigunattack.png”);
imagen2=新纹理(Gdx.files.internal(“C:/Users/HOME/Desktop/tilemap/tilemap/data/sprites/player/minigunstand.png”);
TextureRegion[][]tmp=TextureRegion.split(图像,
imagen.getWidth()/5,imagen.getHeight();
imagen1=新纹理(Gdx.files.internal(“C:/Users/HOME/Desktop/tilemap/tilemap/data/sprites/player/feet.png”);
纹理区域[][]tmp1=纹理区域分割(图像1,
imagen1.getWidth()/5,imagen1.getHeight();
movPlayer=新纹理区域[5];
MOVFEETS=新纹理区域[5];
对于(int i=0;i我建议您为您的世界使用视口和一些常量值
首先,我们以像素为单位定义默认屏幕宽度和高度。不管最终屏幕有多大。
在我的示例中,我说默认屏幕大小是:512x256像素
其次,我必须确定一米有多少像素。所以如果我说256像素是一米,我的视口显示我的世界的2x1米。这非常小。如果我想让我的视口显示例如16米,我可以计算:512/16=像素每米。在本例中为32
最后,我们创建一个Constants
类:
public class Constants {
public static final float PPM = 32; // PPM = Pixel per Meter
public static final float MPP = 1 / PPM; // MPP = Meter per Pixel
public static final int WORLD_PIXEL_WIDTH = 512;
public static final int WORLD_PIXEL_HEIGHT = 256;
public static final float WORLD_WIDTH = WORLD_PIXEL_WIDTH / PPM; //in meter
public static final float WORLD_HEIGHT = WORLD_PIXEL_HEIGHT / PPM; //in meter
}
现在,当您在游戏后期看到显示的世界太小或太大时,您可以更改世界像素\u宽度
和世界像素\u高度
以显示更多或更少的内容
现在我们创建我们的正交摄影机
,FitViewport
和正交平铺摄影机
视口是游戏中非常重要的一部分。如果你想了解更多关于视口的信息,请阅读
及
因此,首先创建我们的正交摄影机
“摄影机”和FitViewport
“视口”
camera = new OrthographicCamera();
viewport = new FitViewport(Constants.WORLD_WIDTH, Constants.WORLD_HEIGHT, camera);
camera.position.set(viewport.getWorldWidth() / 2, viewport.getWorldHeight() / 2, 0); // Differ from your I eat ann Apple
然后我们的SpriteBatch
“批处理”和tileMap
“映射”
batch = new SpriteBatch();
map = app.getAssets().loadSingleAsset("map/" + level + ".tmx", TiledMap.class);
最后,我们的正交贴图渲染器
“贴图渲染器”
mapRenderer = new OrthogonalTiledMapRenderer(map, Constants.MPP);
要呈现我们的世界:
@Override
public void render(float delta) {
camera.update();
mapRenderer.setView(camera);
mapRenderer.render();
batch.setProjectionMatrix(camera.combined);
batch.begin();
player.draw(batch);
batch.end();
}
你忘了batch.setProjectionMatrix(camera.combined);
如果我把玩家的精灵变大并填满整个屏幕:/哇,谢谢你的教程。通过你的解释,我已经解决了我的问题。谢谢!。