almost 5 years ago

LibGDXのマップ関連クラスはcom.badlogic.gdx.mapsパッケージで見つけられる。パッケージルートには基本的なクラスがあり、サブパッケージには専門的なマップや特徴的なマップクラスがある。

基本クラスはマップを表現する基本的なクラスである。タイルマップ以外の2Dマップもサポートされている。マップはレイヤーのセットである。レイヤーはオブジェクトのセットである。マップ、レイヤー、オブジェクトはプロパティをもっており、ロードしたマップフォーマットに依存している。なぜなら、専門的なマップ、レイヤーオブジェクトの実装が色々あるためである。

プロパティは、MapPropertiesによって表現される。このクラスは基本的にキーと任意の値からなるハッシュマップである。そのキーと値はロードされたフォーマットに依存する。プロパティへアクセスするには

map.getProperties().get("custom-property", String.class);
layer.getProperties().get("another-property", Float.class);
object.getProperties().get("foo", Boolean.class);

サポートされた多くのマップエディターはマップ、レイヤー、オブジェクトのプロパティの指定ができる。

マップレイヤーは0を開始としたindexで取り出せる。

MapLayer layer = map.getLayers().getLayer(0);

名前でも取り出せる。

MapLayer layer = map.getLayers().getLayer("my-layer");

getLayer()は、常にMapLayerを返すので、専門的なマップやより多くの機能を使いたいならキャストで取り出す必要がある。

TiledMapTileLayer tiledLayer = (TiledMapTileLayer)map.getLayers().getLayer(0);

マップレイヤーは幾つかの標準かされた属性をもっており取り出せるようになっている。

String name = layer.getName();
float opacity = layer.getOpacity();
boolean isVisible = layer.isVisible();

マップオブジェクトはgetObjectsから取り出せる。

MapObjects objects = map.getObjects();

MapObjectsから個々のマップオブジェクトをインデックス、名前、インスタンスを指定して取り出すことができる。

マップAPIは少量ではあるが、CircleMapObject, PolygonMapObject等の専門的なマップオブジェクトを提供している。それらのオブジェクトはマップローダによってパースされ個々のレイヤーに置かれる。全てのマップオブジェクトは標準化された属性をもっており取り出すことができる。

String name = object.getName();
float opacity = object.getOpacity();
boolean isVisible = object.isVisible();
Color color = object.getColor();

PolygonMapObjectのような専門的なオブジェクトは追加属性を持っている。

Polygon poly = polyObject.getPolygon();

オブジェクトは一般的にスパウンポイントや衝突シェイプのトリガーとして使われる。なお、後述するタイルマップのレイヤーはマップオブジェクトをもっていない。

MapRendererインターフェースは、マップ、レイヤー、オブジェクトを描画するためのメソッドを定義する。描画を行う前にマップのビューを設定しなければならない。簡単なやり方はOrthographicCameraを与えることだ。

mapRenderer.setView(camera);

または、プロジェクションマトリックス(射影行列)と境界線を手動で設定できる。

mapRenderer.setView(projectionMatrix, startX, startY, endx, endY);

全てのマップレイヤーの描写は引数無しのrender()を呼べばいい。レイヤーの描写を制御したい場合はレイヤーの番号をint配列で指定することもできる。バックエンドのレイヤーが二つ、フォアグラウンドのレイヤーが一つあったとしたらこうなる。

int[] backgroundLayers = { 0, 1 }
int[] foregroundLayers = { 2 }; 
mapRenderer.render(backgroundLayers);
mapRenderer.render(foregroundLayers);
← libGDX - タイルマップ markdownのテスト →