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

Java 无法使用OrthogonalTiledMapRenderer(Android)渲染.tmx贴图,java,android,libgdx,rendering,tmx,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

我很难用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() {
}
}
因此,当我尝试运行应用程序并调用render方法时,我只会得到一个红色背景,上面没有任何内容。 以下是我尝试过的一些事情:

  • 使用一个只有一行平铺的较小地图,可以正确显示(尽管我不确定它是否位于正确的位置):
  • 玩弄缩放:我可以显示地图,但它要么非常小,要么只能看到边缘
  • 将此行更改为:
    tiledMarenderer=新的正交tiledMarenderer(地图,0.5f)我得到:

    使用这一行:
    tiledmarenderer=新的正交tiledmarenderer(地图,1/8f)

    我在地图上看到了这张非常缩小的图像:

    有人知道我做错了什么吗?也许我的tmx文件坏了,也许是相机的问题,或者是我真的不知道的问题。
    谢谢你的帮助

    根据地图设置摄影机视口,如下所示

    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的工作原理:

    编辑

    我检查了.tmx文件,它有3层。在0索引处有一个
    TiledMapImageLayer
    ,这就是为什么它会给你施法错误。在索引1和索引2中有
    TiledMatipleLayer
    ,因此从索引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块)


    width-heightratio
    如果保持比例,则变为1。

    请告诉我一个像素的瓷砖尺寸?你想在屏幕上一次水平和垂直显示多少个平铺?我还不知道,现在我只想能够显示所有东西,看看地图是什么样子。之后,我可以调整某些东西。当您创建.tmx文件时,您可以在那里决定一个平铺尺寸和整个地图大小(宽度和高度的平铺数量)?这些是editorI中的设置,可能是关于一些东西的,下面是地图的外观(其他人为我制作的)。可能是我在渲染空部件吗?不幸的是,它也不起作用。第一个解决方案给出了一个从TiledMapImageLayer到TiledMapileLayer的投射错误,即使手动将相机设置为(100*34100*34)也无法工作。第二个选项具有完全相同的结果。只是一个普通的红色背景。谢谢你到目前为止的帮助!我认为您使用的是TiledMapileLayer层=(TiledMapImageLayer)map.getLayers().get(0);而不是TiledMattileLayer层=(TiledMattileLayer)map.getLayers().get(0);我不是,但如果我像这样构造摄影机对象,那也不重要:摄影机=新正交摄影机(100*34100*34);即使这样,我也只得到一个红色屏幕基本上没什么变化我能得到你的.tmx文件吗?