俺とプログラミング

某IT企業でエンジニアをしてます。このブログではプログラミングに関わることを幅広く発信します。

【libGDX入門】TiledMapを描画しよう

TiledMapとは二次元のタイルをつなぎあわせて、簡単にマップを表現できるツールです。 TiledMapを作れるTiledMapEditorの使いかたは以下の記事を参照。

libGDXでの読込みと描画

libGDXでTiledMapを読み込んで、描画する方法を紹介します。

package com.mygdx.game;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.maps.tiled.TiledMap;
import com.badlogic.gdx.maps.tiled.TiledMapRenderer;
import com.badlogic.gdx.maps.tiled.TmxMapLoader;
import com.badlogic.gdx.maps.tiled.renderers.OrthoCachedTiledMapRenderer;
import com.badlogic.gdx.utils.viewport.FillViewport;
import com.badlogic.gdx.utils.viewport.Viewport;

public class MyGdxGame extends ApplicationAdapter{
    TiledMap tiledMap;
    TiledMapRenderer tiledRenderer;
    OrthographicCamera camera;
    Viewport viewport;
    public final int WIDTH = 480;
    public final int HEIGHT = 800;

    @Override
    public void create() {
        camera = new OrthographicCamera();
        camera.setToOrtho(false, WIDTH, HEIGHT);
        viewport = new FillViewport(WIDTH, HEIGHT);
        viewport.setCamera(camera);

        /* TiledMapの読込みとRendererの初期化 */
        tiledMap = new TmxMapLoader().load("map.tmx");
        tiledRenderer = new OrthoCachedTiledMapRenderer(tiledMap);
    }

    @Override
    public void render() {
        Gdx.gl.glClearColor(1, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        /* TiledMapの描画 */
        camera.update();
        tiledRenderer.setView(camera);
        tiledRenderer.render();

        if (Gdx.input.isTouched()){
            camera.translate(100,0);
        }
    }

    @Override
    public void resize(int width, int height) {
        viewport.update(width,height);
    }
}

上記のコードでは、タップする毎に、カメラが横に移動します。描画されるマップの位置が変わっていくことがわかると思います。
TileMapでは、以下のようにレイヤーやセルを取得したりすることもできます。

MapLayer layer = tiledMap.getLayers().get(0);

レイヤー毎に操作することで、例えば以下のように背景と前景の間に物体を描画したりすることができます。

int[] backgroundLayers = { 0, 1 }; // don't allocate every frame!
int[] foregroundLayers = { 2 };    // don't allocate every frame!
mapRenderer.render(backgroundLayers);
renderMyCustomSprites();
mapRenderer.render(foregroundLayers);
Copyright © 2016 ttlg All Rights Reserved.