无法使用OrthogonalTiledMapRenderer(Android)渲染.tmx地图

时间:2017-02-23 14:16:08

标签: java android libgdx rendering tmx

我很难使用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. 使用较小的地图只有一行瓷砖,这显示正确(即使我不确定它在正确的位置):
  2. small map

    1. 玩缩放:我可以显示地图但是它非常小或我只能看到边缘
    2. 此行更改为:tiledMapRenderer = new OrthogonalTiledMapRenderer(map,0.5f);我得到:

      0.5f scaling

      使用此行:tiledMapRenderer = new OrthogonalTiledMapRenderer(map,1/8f);

      我得到了地图的缩小图像:

      enter image description here

      有谁知道我做错了什么?也许我的tmx文件很糟糕,也许这是相机的东西,或者我真的不知道的其他东西。 谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

根据您的地图设置相机ViewPort。

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。