繁体   English   中英

在libGDX中更改分辨率时如何保持平铺地图的外观

[英]how to maintain the appearance of the tiled map when I change the resolution in libGDX

我为我正在编程的 2D 游戏创建了一个测试平铺地图。 一切都很好!,但是当我更改分辨率时,相机无法正确适应屏幕。

我有一个玩家精灵和 Tile 地图,我使用了 1366x768 的分辨率,你可以看到屏幕适合:

在此处输入图片说明

但是当我更改分辨率时,例如 640x480。 正如您在此图片中看到的,播放器不符合新分辨率:

在此处输入图片说明

播放器看起来更大,但我想根据新的分辨率来适应整个屏幕,包括所有的精灵。

我认为凸轮渲染有问题,但我不知道我能做些什么来解决它。 相机跟随玩家的运动,一切都很好,但我想用所选的分辨率来适应屏幕游戏。

我会把我的代码的一些部分给你看:

下面是主要代码:

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;                                                                                                                
}

同样,摄像机被编程为跟随玩家并且工作正常。 但是当我想将其更改为另一种分辨率时,精灵播放器不适合平铺地图:(。

希望有人可以帮助我...谢谢!

我建议您为您的世界使用视口和一些常量值。

首先,我们以像素为单位定义默认的屏幕宽度和高度。 不管最终画面有多大。 在我的示例中,我说默认屏幕尺寸是:512x256 像素。

其次,我必须决定一米有多少像素。 因此,如果我说 256 像素是一米,那么我的视口将显示我的世界的 2x1 米。 那非常小。 如果我希望我的视口显示例如 16 米,我可以计算:512 / 16 = Pixel_Per_Meter。 在这种情况下 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
}

现在,当您在游戏后期看到显示的世界太小或太大时,您可以更改WORLD_PIXEL_WIDTHWORLD_PIXEL_HEIGHT以显示更多或更少

现在我们创建OrthographicCameraFitViewportOrthogonalTiledMapRenderer

视口是游戏中非常重要的部分。 如果您想了解更多关于视口的信息,请阅读从另一个类Libgdx 设置正交相机调用渲染方法的视口部分

所以首先创建我们的OrthographicCamera 'camera' 和我们的FitViewport 'viewport'

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 'batch' 和TiledMap 'map'

batch = new SpriteBatch();
map = app.getAssets().loadSingleAsset("map/" + level + ".tmx", TiledMap.class);

最后,我们的OrthogonalTiledMapRenderer 'mapRenderer'

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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM