Java - LibGDX - 渲染平铺地图的过程中出现问题
Java - LibGDX - Problems with the process of rendering a Tiled map
问题
我似乎无法正确渲染 Tiled 地图。我正在使用 LibGDX 作为加载地图的库 (Release 1.6.0).
视频演示
我制作了一个视频来向您展示实际问题,并通过跳过整个解释过程让事情变得更容易。 Here is a link 给它。
我用过的代码
protected Level level;
protected OrthogonalTiledMapRenderer mapRenderer;
protected OrthographicCamera camera;
protected TiledMap map;
protected MainGameLoop game;
protected SpriteBatch batch;
private BitmapFont font;
private int w, h;
public Level1(MainGameLoop game) {
this.game = game;
}
@Override
public void show() {
w = Gdx.graphics.getWidth();
h = Gdx.graphics.getHeight();
int CAMERA_WIDTH = 800;
int CAMERA_HEIGHT = 450 * (w / h);
camera = new OrthographicCamera(CAMERA_WIDTH, CAMERA_HEIGHT);
camera.setToOrtho(false);
camera.update();
map = new TmxMapLoader().load("maps/map1.tmx");
mapRenderer = new OrthogonalTiledMapRenderer(map);
Gdx.input.setInputProcessor(this);
font = new BitmapFont();
font.setColor(Color.BLUE);
batch = new SpriteBatch();
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
camera.update();
mapRenderer.setView(camera);
mapRenderer.render();
batch.begin();
font.draw(batch, "Camera zoom: " + camera.zoom, 40, 40);
batch.end();
}
@Override
public void resize(int width, int height) {
camera.viewportWidth = width;
camera.viewportHeight = height;
camera.update();
}
@Override
public void dispose() {
mapRenderer.dispose();
map.dispose();
background.dispose();
Gdx.input.setInputProcessor(null);
}
@Override
public boolean scrolled(int amount) {
camera.zoom += amount;
camera.update();
return true;
}
// Here go the rest of the methods, such as pause, resume, hide, keyDown, keyUp, keyTyped, touchDown, touchUp, touchDragged & mouseMoved.
我试过的解决方案
我曾尝试为相机的 x 和 y 使用不同的数字,但没有成功。我也尝试过将相机平移到正确的位置 (硬编码),以及使用另一张地图 (不同的瓷砖地图和尺寸) 但是也没用。
结论
我似乎找不到解决此问题的方法。任何帮助深表感谢。非常感谢。
快速介绍
好的,过了一会儿,我设法通过硬编码一些东西解决了这个问题。但它工作正常,所以我很满意。
我是如何解决问题的
- 首先,我找到了我必须用来放大我的 Tiled 地图的确切数字,也就是这个数字:
3.125f
。
- 然后,我没有使用相机的像素,而是使用了我自己的单位 (我从一开始就应该做的事情).
- 做完这两件事后,我发现地图放大了很多。因此,通过使用
InputProcessor
中的 scrolled
方法,我设法找到了地图必须为 "unzoomed".[=46 的确切数字=]
- 我还发现,如果我从
OrthographicCamera
对象调用 setToOrtho(false)
方法,它会出于某种奇怪的原因将地图放大 19 倍 .如果没有调用该方法,地图只会放大 1 倍
我目前使用的代码
TiledMap tiledMap;
OrthographicCamera camera;
TiledMapRenderer tiledMapRenderer;
final float WIDTH = 8000;
final float HEIGHT = 4500;
final float num = 3.125f;
@Override
public void show() {
tiledMap = MapLoader.realm1_level1;
tiledMapRenderer = new OrthogonalTiledMapRenderer(tiledMap, num);
camera = new OrthographicCamera(WIDTH, HEIGHT);
Gdx.input.setInputProcessor(this);
camera.zoom += 1f;
camera.update();
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
tiledMapRenderer.setView(camera);
tiledMapRenderer.render();
}
// This method was just used for testing to see where
// the map was or should have been placed.
@Override
public boolean keyDown(int keycode) {
if (keycode == Input.Keys.LEFT)
camera.translate(-32, 0);
if (keycode == Input.Keys.RIGHT)
camera.translate(32, 0);
if (keycode == Input.Keys.UP)
camera.translate(0, 32);
if (keycode == Input.Keys.DOWN)
camera.translate(0, -32);
if (keycode == Input.Keys.NUM_1)
tiledMap.getLayers().get(0).setVisible(!tiledMap.getLayers().get(0).isVisible());
return true;
}
@Override
public void resize(int width, int height) {
camera.position.set(WIDTH, HEIGHT, 0);
camera.update();
}
@Override
public boolean scrolled(int amount) {
camera.zoom += amount;
camera.update();
return true;
}
@Override
public void dispose() {
tiledMap.dispose();
}
// And here go the rest of the methods that come from the
//Screen and the InputProcessor interfaces.
备注
- 我用于
WIDTH
和 HEIGHT
变量的数字正常工作,strictly 平铺地图 width 是80 块,它们的高度是 45 块。
- 如果您遇到同样的问题,则必须找到合适的数字来缩放地图 up/down,具体取决于您使用的单位数字。 试错是你唯一的指南。 如果我们当然忽略 Whosebug。
问题
我似乎无法正确渲染 Tiled 地图。我正在使用 LibGDX 作为加载地图的库 (Release 1.6.0).
视频演示
我制作了一个视频来向您展示实际问题,并通过跳过整个解释过程让事情变得更容易。 Here is a link 给它。
我用过的代码
protected Level level;
protected OrthogonalTiledMapRenderer mapRenderer;
protected OrthographicCamera camera;
protected TiledMap map;
protected MainGameLoop game;
protected SpriteBatch batch;
private BitmapFont font;
private int w, h;
public Level1(MainGameLoop game) {
this.game = game;
}
@Override
public void show() {
w = Gdx.graphics.getWidth();
h = Gdx.graphics.getHeight();
int CAMERA_WIDTH = 800;
int CAMERA_HEIGHT = 450 * (w / h);
camera = new OrthographicCamera(CAMERA_WIDTH, CAMERA_HEIGHT);
camera.setToOrtho(false);
camera.update();
map = new TmxMapLoader().load("maps/map1.tmx");
mapRenderer = new OrthogonalTiledMapRenderer(map);
Gdx.input.setInputProcessor(this);
font = new BitmapFont();
font.setColor(Color.BLUE);
batch = new SpriteBatch();
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
camera.update();
mapRenderer.setView(camera);
mapRenderer.render();
batch.begin();
font.draw(batch, "Camera zoom: " + camera.zoom, 40, 40);
batch.end();
}
@Override
public void resize(int width, int height) {
camera.viewportWidth = width;
camera.viewportHeight = height;
camera.update();
}
@Override
public void dispose() {
mapRenderer.dispose();
map.dispose();
background.dispose();
Gdx.input.setInputProcessor(null);
}
@Override
public boolean scrolled(int amount) {
camera.zoom += amount;
camera.update();
return true;
}
// Here go the rest of the methods, such as pause, resume, hide, keyDown, keyUp, keyTyped, touchDown, touchUp, touchDragged & mouseMoved.
我试过的解决方案
我曾尝试为相机的 x 和 y 使用不同的数字,但没有成功。我也尝试过将相机平移到正确的位置 (硬编码),以及使用另一张地图 (不同的瓷砖地图和尺寸) 但是也没用。
结论
我似乎找不到解决此问题的方法。任何帮助深表感谢。非常感谢。
快速介绍
好的,过了一会儿,我设法通过硬编码一些东西解决了这个问题。但它工作正常,所以我很满意。
我是如何解决问题的
- 首先,我找到了我必须用来放大我的 Tiled 地图的确切数字,也就是这个数字:
3.125f
。 - 然后,我没有使用相机的像素,而是使用了我自己的单位 (我从一开始就应该做的事情).
- 做完这两件事后,我发现地图放大了很多。因此,通过使用
InputProcessor
中的scrolled
方法,我设法找到了地图必须为 "unzoomed".[=46 的确切数字=] - 我还发现,如果我从
OrthographicCamera
对象调用setToOrtho(false)
方法,它会出于某种奇怪的原因将地图放大 19 倍 .如果没有调用该方法,地图只会放大 1 倍
我目前使用的代码
TiledMap tiledMap;
OrthographicCamera camera;
TiledMapRenderer tiledMapRenderer;
final float WIDTH = 8000;
final float HEIGHT = 4500;
final float num = 3.125f;
@Override
public void show() {
tiledMap = MapLoader.realm1_level1;
tiledMapRenderer = new OrthogonalTiledMapRenderer(tiledMap, num);
camera = new OrthographicCamera(WIDTH, HEIGHT);
Gdx.input.setInputProcessor(this);
camera.zoom += 1f;
camera.update();
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
tiledMapRenderer.setView(camera);
tiledMapRenderer.render();
}
// This method was just used for testing to see where
// the map was or should have been placed.
@Override
public boolean keyDown(int keycode) {
if (keycode == Input.Keys.LEFT)
camera.translate(-32, 0);
if (keycode == Input.Keys.RIGHT)
camera.translate(32, 0);
if (keycode == Input.Keys.UP)
camera.translate(0, 32);
if (keycode == Input.Keys.DOWN)
camera.translate(0, -32);
if (keycode == Input.Keys.NUM_1)
tiledMap.getLayers().get(0).setVisible(!tiledMap.getLayers().get(0).isVisible());
return true;
}
@Override
public void resize(int width, int height) {
camera.position.set(WIDTH, HEIGHT, 0);
camera.update();
}
@Override
public boolean scrolled(int amount) {
camera.zoom += amount;
camera.update();
return true;
}
@Override
public void dispose() {
tiledMap.dispose();
}
// And here go the rest of the methods that come from the
//Screen and the InputProcessor interfaces.
备注
- 我用于
WIDTH
和HEIGHT
变量的数字正常工作,strictly 平铺地图 width 是80 块,它们的高度是 45 块。 - 如果您遇到同样的问题,则必须找到合适的数字来缩放地图 up/down,具体取决于您使用的单位数字。 试错是你唯一的指南。 如果我们当然忽略 Whosebug。