1

問題

タイル マップを適切にレンダリングすることができないようです。マップをロードするためのライブラリとしてLibGDXを使用しています(リリース 1.6.0)

ビデオデモンストレーション

実際の問題を示し、説明のプロセス全体をスキップして簡単にするために、ビデオを作成しました。ここにリンクがあります。

私が使用したコード

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に異なる数値を使用してみましたが、うまくいきませんでした。また、カメラを適切な位置に移動(ハードコーディング)したり、別のマップ(異なるタイルマップと寸法)を使用したりしましたが、どちらも機能しませんでした。

結論

この問題を解決する方法が見つからないようです。どんな助けでも大歓迎です。どうもありがとうございました。

4

1 に答える 1

1

簡単な紹介

しばらくして、いくつかのものをハードコーディングすることでこの問題を解決することができました。でもちゃんと動くので満足です。

問題を解決するために私がしたこと

  • まず、タイル マップを拡大するために使用しなければならなかった正確な数値を見つけました。これは次の数値です3.125f
  • 次に、カメラにピクセルを使用する代わりに、独自のユニットを使用 しました (最初からそうすべきでした)
  • これら 2 つのことを行った後、マップが大幅に拡大されていることに気付きました。scrolledそのため、 のメソッドを使用して、マップを「ズーム解除」InputProcessorする必要があった正確な数を見つけることができました。
  • setToOrtho(false)また、オブジェクトからメソッドを呼び出すと、奇妙な理由でOrthographicCameraマップが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. WIDTHおよび変数に使用した数値は、幅が 80 tile高さが 45 tile のタイル マップで厳密にHEIGHT正しく機能します。
  2. 同じ問題に直面している場合は、使用しているユニット数に応じて、マップを拡大/縮小する適切な数を見つける必要があります。試行錯誤はあなたの唯一のガイドです。 もちろん、StackOverflow を無視すると。
于 2015-06-21T13:13:15.243 に答える