【问题标题】:Java - LibGDX - Problems with the process of rendering a Tiled mapJava - LibGDX - 渲染平铺地图的过程中的问题
【发布时间】:2015-09-03 20:20:20
【问题描述】:

问题

我似乎无法正确渲染平铺地图。我使用 LibGDX 作为加载地图的库(版本 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.

我尝试过的解决方案

我尝试为相机的 xy 使用不同的数字,但没有成功。我还尝试将相机移动到正确的位置(硬编码),以及使用另一张地图(不同的瓦片图和尺寸),但这也不起作用。

结论

我似乎找不到解决此问题的方法。任何帮助深表感谢。非常感谢。

【问题讨论】:

  • “平铺地图未正确渲染”是什么意思?我看了视频,但看不到,有什么问题。
  • @JoOko 它被放置在整个窗口的随机位置,正如您在视频中看到的那样,地图的角落不在窗口的角落。换句话说,地图不会拉伸以适应屏幕的尺寸,而只是“坐”在那里,无论我将相机的 xy 坐标放在哪里.我希望这能解决问题。任何帮助深表感谢。提前致谢。

标签: java android libgdx tiled tmx


【解决方案1】:

快速介绍

好吧,过了一会儿,我设法通过硬编码一些东西来解决这个问题。但它工作正常,所以我很满意。

我做了什么来解决这个问题

  • 首先,我找到了我必须用来放大我的 Tiled 地图的确切数字,即这个数字:3.125f
  • 然后,我没有为相机使用像素,而是使用我自己的单位 (我从一开始就应该这样做)
  • 做了这两件事后,我注意到地图被放大了很多。因此,通过使用InputProcessor 中的scrolled 方法,我设法找到了地图必须“未缩放”的确切数字。
  • 我还发现,如果我从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.

注意事项

  1. 我用于 WIDTHHEIGHT 变量的数字可以正常工作,严格使用它们的宽度为 80 个图块的平铺地图,以及它们的 >高度为 45 格
  2. 如果您遇到同样的问题,您必须找到合适的数字来放大/缩小地图,具体取决于您使用的单位编号。 反复试验是您唯一的指南。 如果我们当然忽略 StackOverflow。

【讨论】:

    猜你喜欢
    • 2016-06-04
    • 2014-10-23
    • 2020-08-24
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 2014-05-04
    • 2020-08-28
    相关资源
    最近更新 更多