无法使用 OrthogonalTiledMapRenderer 渲染 .tmx 地图 (Android)
Cannot render .tmx map using OrthogonalTiledMapRenderer (Android)
我很难使用 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() {
}
}
因此,当我尝试 运行 应用程序并调用渲染方法时,我只得到一个没有任何内容的红色背景。
以下是我尝试过的一些方法:
- 使用只有一行图块的较小地图,这显示正确(即使我不确定它在正确的位置):
- 尝试缩放:我可以显示地图,但它要么非常小,要么只能看到边缘
将此行更改为:tiledMapRenderer = new OrthogonalTiledMapRenderer(map,0.5f);
我得到:
加上这一行:tiledMapRenderer = new OrthogonalTiledMapRenderer(map,1/8f);
我得到这张非常缩小的地图图像:
有谁知道我做错了什么?也许我的 tmx 文件有问题,也许是相机的问题,或者其他我真的不知道的问题。
感谢您的帮助!
像这样根据您的地图设置Camera 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
我很难使用 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() {
}
}
因此,当我尝试 运行 应用程序并调用渲染方法时,我只得到一个没有任何内容的红色背景。 以下是我尝试过的一些方法:
- 使用只有一行图块的较小地图,这显示正确(即使我不确定它在正确的位置):
- 尝试缩放:我可以显示地图,但它要么非常小,要么只能看到边缘
将此行更改为:tiledMapRenderer = new OrthogonalTiledMapRenderer(map,0.5f);
我得到:
加上这一行:tiledMapRenderer = new OrthogonalTiledMapRenderer(map,1/8f);
我得到这张非常缩小的地图图像:
有谁知道我做错了什么?也许我的 tmx 文件有问题,也许是相机的问题,或者其他我真的不知道的问题。 感谢您的帮助!
像这样根据您的地图设置Camera 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