Android Libgdx摄影机/视口/平铺贴图

Android Libgdx摄影机/视口/平铺贴图,android,libgdx,viewport,orthographic,Android,Libgdx,Viewport,Orthographic,我正在尝试制作一个基于平铺贴图的游戏,带有摄像头和视口。 我的游戏应该缩放到整个屏幕都没有黑条(就像在香蕉港一样)。我找到了ExtendViewport,我想它应该可以解决这个问题 在尝试了很多东西之后,我没有找到正确的解决方法。始终将地图缩放到较小或/或错误的位置。当我在电脑上缩放窗口时,它应该用平铺贴图填充整个高度,然后用平铺贴图的可绘制部分填充整个屏幕长度,并提及纵横比 这是我到目前为止的代码,如何使它工作 public class LoadingScreen implements Scr

我正在尝试制作一个基于平铺贴图的游戏,带有摄像头和视口。 我的游戏应该缩放到整个屏幕都没有黑条(就像在香蕉港一样)。我找到了ExtendViewport,我想它应该可以解决这个问题

在尝试了很多东西之后,我没有找到正确的解决方法。始终将地图缩放到较小或/或错误的位置。当我在电脑上缩放窗口时,它应该用平铺贴图填充整个高度,然后用平铺贴图的可绘制部分填充整个屏幕长度,并提及纵横比

这是我到目前为止的代码,如何使它工作

public class LoadingScreen implements Screen {
//Reference to MainGameClass
private MainGameClass game;

//Camera and Viewport
private OrthographicCamera gamecam;
private Viewport gamePort;

//Tiled MaP
private TmxMapLoader maploader;
private TiledMap map;
private OrthogonalTiledMapRenderer renderer;

public LoadingScreen(MainGameClass game) {
    this.game = game;

    //Camera and Viewport
    gamecam = new OrthographicCamera();
    gamePort = new ExtendViewport(MainGameClass.WIDTH, MainGameClass.HEIGHT, gamecam);

    //Tiledmap
    maploader = new TmxMapLoader();
    map = maploader.load("MarioBros.tmx");
    renderer = new OrthogonalTiledMapRenderer(map, 1);
    gamecam.setToOrtho(false);
}

@Override
public void show() {

}

public void update(float dt) {
    //gamecam.position.x += 1;
    gamecam.update();
    renderer.setView(gamecam);
}

@Override
public void render(float delta) {
    update(delta);

    //Clear Game Screen with black
    Gdx.gl.glClearColor(0,0,0,1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    renderer.render();

    //Begin GameBatch
    game.batch.setProjectionMatrix(gamecam.combined);
}

@Override
public void resize(int width, int height) {
    gamePort.update(width,height);
    gamecam.setToOrtho(false);
}

@Override
public void pause() {

}

@Override
public void resume() {

}

@Override
public void hide() {

}

@Override
public void dispose() {

}
}
希望有人能帮忙

编辑1:

手机的高度应始终与整个水平高度一致。那么你看到的地图的长度也应该总是填满整个屏幕。所以在手机上,你可以看到更多的水平,水平的高度总是和手机一样高

另外,当我用鼠标手动缩放电脑上的窗口时,视图应该会更新!
要将视口限制为地图区域,需要执行几个步骤

首先,我们需要计算出地图的全宽,这样我们就知道需要显示多少地图

int totalMapWidth = totalHorizontalTiles * pixelPerTile;
int totalMapHeight = totalVerticalTiles * pixelPerTile;
现在我们有了地图大小,我们想要的是视口大小,这样我们就可以对比totalMapWidth和totalMapHeight

viewport.getWorldWidth();  // our viewport width
viewport.getWorldHeight(); // our viewport height
最后,我们需要相机的缩放值

float zoom = camera.zoom;
使用上述所有数据,我们可以在应用缩放的情况下计算视口宽度

float evalWidth = viewport.getWorldWidth() * cam.zoom;
float evalHeight= viewport.getWorldHeight() * cam.zoom;
最后一步是将相机位置夹紧到地图区域内的位置

cam.position.x = MathUtils.clamp(cam.position.x, evalWidth / 2f, 
                    totalMapWidth - evalWidth / 2f);
cam.position.y = MathUtils.clamp(cam.position.y, evh / 2f,
                                    totalMapHeight - evh / 2f);
当以合理的水平缩放时,这将停止相机显示地图以外的区域。如果用户缩小太远,以致地图小于视口宽度或高度,则会显示外部区域。为了停止此操作,还需要通过限制缩放来钳制缩放级别

float minZoom = 0.1f; // this is the zoomed in value
float maxZoom = 1; // this is zoomed out level
现在夹紧摄像机

camera.zoom = Math.clamp(camera.zoom, minZoom,maxZoom);
因此,摄影机视口尺寸应为:

viewportWidth= 10 * 16 ;
viewportHeight= 6 * 16 ;

cam=new OrthographicCamera();
cam.setToOrtho(false,viewportWidth,viewportHeight);

TmxMapLoader tmxMapLoader=new TmxMapLoader();
TiledMap tiledMap=tmxMapLoader.load("untitled.tmx");

tiledMapRenderer=new OrthoCachedTiledMapRenderer(tiledMap);
tiledMapRenderer.setView(cam);
渲染

tiledMapRenderer.render();
我建议每个屏幕/页面至少使用15*10个平铺,平铺宽度或平铺高度为32像素。当你将数字增加到平铺时,你将在游戏中获得更好的精度

编辑

您可以通过以下方式使用ExtendViewport:

public class MyTest extends ApplicationAdapter {

    OrthogonalTiledMapRenderer renderer;
    OrthographicCamera cam;
    ExtendViewport viewport;

    float viewportWidth,viewportHeight;

    @Override
    public void create() {

        viewportWidth=16*10;
        viewportHeight=6*16;

        cam=new OrthographicCamera();
        viewport=new ExtendViewport(viewportWidth,viewportHeight,cam);

        TmxMapLoader loader=new TmxMapLoader();
        TiledMap map=loader.load("untitled1.tmx");

        renderer=new OrthogonalTiledMapRenderer(map);
        renderer.setView(cam);
    }

    @Override
    public void render() {

        Gdx.gl.glClearColor(1,1,1,1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        renderer.setView(cam);
        renderer.render();
    }

    @Override
    public void resize(int width, int height) {
        viewport.update(width,height,false);
        viewport.getCamera().position.set(viewportWidth/2f,viewportHeight/2f,0);
        viewport.getCamera().update();
    }
}

MainGameClass.WIDTH、HEIGHT的值是多少?地图的平铺宽度、平铺高度和地图大小的值是多少?MainGameClass.WIDTH是屏幕/窗口高度,所以这里是480px,平铺宽度/高度为16px,其6个平铺高度和60个长平铺高度。MainGameClass.WIDTH和Height为常量值?是的,其常量值为这些常量值?为什么视口宽度为16*10?我也只能使用相机进行此操作?如果没有像第一篇博文中那样的视口,16是平铺宽度,我假设屏幕上有10个平铺,因此您总共有6页10个平铺每页*6页,因此总共60个平铺是地图宽度
public class MyTest extends ApplicationAdapter {

    OrthogonalTiledMapRenderer renderer;
    OrthographicCamera cam;
    ExtendViewport viewport;

    float viewportWidth,viewportHeight;

    @Override
    public void create() {

        viewportWidth=16*10;
        viewportHeight=6*16;

        cam=new OrthographicCamera();
        viewport=new ExtendViewport(viewportWidth,viewportHeight,cam);

        TmxMapLoader loader=new TmxMapLoader();
        TiledMap map=loader.load("untitled1.tmx");

        renderer=new OrthogonalTiledMapRenderer(map);
        renderer.setView(cam);
    }

    @Override
    public void render() {

        Gdx.gl.glClearColor(1,1,1,1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        renderer.setView(cam);
        renderer.render();
    }

    @Override
    public void resize(int width, int height) {
        viewport.update(width,height,false);
        viewport.getCamera().position.set(viewportWidth/2f,viewportHeight/2f,0);
        viewport.getCamera().update();
    }
}