【问题标题】:Cannot render .tmx map using OrthogonalTiledMapRenderer (Android)无法使用 OrthogonalTiledMapRenderer (Android) 渲染 .tmx 地图
【发布时间】:2017-07-14 01:59:40
【问题描述】:

我很难使用 LibGdx 在我的 android 应用程序上正确显示地图。首先是我的代码:

public class PlayState extends State {
  private LittleMan littleMan;
  private TiledMap map;
  OrthogonalTiledMapRenderer tiledMapRenderer;

  OrthographicCamera camera;

public PlayState(GameStateManager gsm) {
    super(gsm);
    littleMan = new LittleMan(50,100);
    float w = Gdx.graphics.getWidth();
    float h = Gdx.graphics.getHeight();
    camera = new OrthographicCamera();
    camera.setToOrtho(false, w,h);
    camera.update();
    TmxMapLoader loader = new TmxMapLoader();
    map = loader.load("ste_barbe_map.tmx");
    tiledMapRenderer = new OrthogonalTiledMapRenderer(map);
}

@Override
protected void handleInput() {
}

@Override
public void update(float dt) {
}

@Override
public void render(SpriteBatch sb) {
    // if viewport modified
    // sb.setProjectionMatrix(cam.combined);
    Gdx.gl.glClearColor(1, 0, 0, 1);
    Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    camera.update();
    tiledMapRenderer.setView(camera);
    tiledMapRenderer.render();
    /*
    sb.begin();
    sb.draw(littleMan.getTexture(),littleMan.getPosition().x,littleMan.getPosition().y);
    sb.end();
    */
}

@Override
// free some ressources
public void dispose() {
}
}

所以当我尝试运行应用程序并调用渲染方法时,我只会得到一个红色背景,上面什么都没有。 以下是我尝试过的一些事情:

  1. 使用只有一行图块的较小地图,它可以正确显示(即使我不确定它的位置是否正确):

  1. 玩转缩放:我可以显示地图,但地图要么非常小,要么我只能看到边缘

将此行更改为:tiledMapRenderer = new OrthogonalTiledMapRenderer(map,0.5f);我得到:

还有这行:tiledMapRenderer = new OrthogonalTiledMapRenderer(map,1/8f);

我得到这张地图的非常缩小的图像:

有谁知道我做错了什么?也许我的 tmx 文件不好,也许是相机的问题,或者我真的不知道的其他问题。 感谢您的帮助!

【问题讨论】:

  • 请告诉我一个平铺尺寸(以像素为单位)?以及您想在屏幕上一次显示多少个平铺和垂直平铺?
  • 还不知道,现在我只想能够显示所有内容并查看地图的外观。之后我可以调整某些东西。
  • 当你创建 .tmx 文件时,你决定一个瓦片尺寸和整个地图大小(瓦片的宽度和高度数)?
  • gyazo.com/89c6703d0d2370ceeb3d5c3f1cdabf8b这些是编辑器里的设置
  • 我可能正在做一些事情,这是地图的外观(其他人为我制作的)。难道是即时渲染空的部分? gyazo.com/29ef2f197921bbd15bc662fbfae88ca6

标签: java android libgdx rendering tmx


【解决方案1】:

像这样根据你的地图设置相机视口。

TmxMapLoader loader = new TmxMapLoader();
map = loader.load("ste_barbe_map.tmx");
tiledMapRenderer = new OrthogonalTiledMapRenderer(map);
TiledMapTileLayer layer=(TiledMapTileLayer)map.getLayers().get(0);

float w=layer.getTileWidth()*layer.getWidth();   // 100*34
float h=layer.getTileHeight()*layer.getHeight();  // 100*34

camera=new OrthographicCamera(w,h);
// you can manually set camera viewport 
//camera=new OrthographicCamera(100*34,100*34);

你也可以试试这个

camera=new OrthographicCamera(34,34);
float unitScale = 1 / 100f;
OrthogonalTiledMapRenderer renderer = new OrthogonalTiledMapRenderer(map, unitScale);

了解 unitScale 的工作原理:
https://github.com/libgdx/libgdx/wiki/Tile-maps#rendering-tiled-maps

编辑

我检查了 .tmx 文件,它有 3 层。在 0 索引处有一个 TiledMapImageLayer,这就是它给你投射错误的原因。在索引 1 和 2 处有 TiledMapTileLayer 所以从索引 1 获取层。

我尝试将您的 .tmx 加载到我的代码中并在显示器上呈现。

public class TestGame extends Game {

    TiledMap map;
    OrthographicCamera camera;
    TiledMapRenderer tiledMapRenderer;

    @Override
    public void create() {

        TmxMapLoader tmxMapLoader=new TmxMapLoader();

        map=tmxMapLoader.load("ste_barbe_map.tmx");

        TiledMapTileLayer layer=(TiledMapTileLayer) map.getLayers().get(1);

        tiledMapRenderer= new OrthogonalTiledMapRenderer(map);
        camera=new OrthographicCamera();
        camera.update();
        float widthHeightRatio=1.66f; 
        camera.setToOrtho(false,(layer.getWidth()*layer.getTileWidth())/widthHeightRatio,layer.getHeight()*layer.getTileHeight());
    }

    @Override
    public void render() {

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

        camera.update();
        tiledMapRenderer.setView(camera);
        tiledMapRenderer.render();
    }
}

地图在水平和垂直方向上具有相同数量的图块。您的游戏将是横向或纵向的,因此请保持这样的比例(横向 25 瓦,垂直 15 瓦)。

widthHeightRatio 保持比例变为 1。

【讨论】:

  • 不幸的是它也不起作用。第一个解决方案给了我从 TiledMapImageLayer 到 TiledMapTileLayer 的投射错误,即使手动将相机设置为 (100*34,100*34) 也不起作用。第二个选项具有完全相同的结果。只是一个普通的红色背景。感谢您迄今为止的所有帮助!
  • 我认为你正在使用 TiledMapTileLayer layer=(TiledMapImageLayer) map.getLayers().get(0);而不是 TiledMapTileLayer layer=(TiledMapTileLayer) map.getLayers().get(0);
  • 我不是,但如果我像这样构造相机对象,这甚至不重要:camera=new OrthographicCamera(100*34,100*34);即使那样我也只会出现红屏
  • 基本上这个gyazo.com/5bcaadd528b548ccbd59fe681d805511没什么变化
  • 我可以得到你的 .tmx 文件吗?
猜你喜欢
  • 2012-11-11
  • 2016-04-29
  • 2013-04-13
  • 2014-09-18
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
相关资源
最近更新 更多