5. マップ表示の実装

はじめに

今回はマップ表示の実装です。

Tiledでマップを作成

Tiledを起動し、新しいタイルマップ(map1.tmx)を作成します。 新しいタイルセット(terrain.tsx)を追加します。マップタイル画像やタイルサイズを指定します。

タイルセットで、障害物にしたいタイルのカスタムプロパティに collision: true を設定します。 (注意)stringではなくboolで指定してください。

タイルマップ(map1.tmx)のタブに切り替えます。 右下ペインで、[埋め込みタイルセット]ボタンをクリックしておきます。あとで出力するJSONにタイルセット情報も含まれるようになります。

右上ペインでレイヤーを作成します。今回はgroundという名前にします。

あとは、タイルマップのブラシを使って、マップを描いていきます。 Terrain setsなどを使うと、海や川のエッジが簡単に描画できるようですが、今回は触れません。

マップができたら、エクスポートでJSONとして出力して保存します。

コード実装

Phaser側で必要なのは、タイルセットで使った画像と出力したJSONファイルです。どちらもassetsフォルダに入れておきます。

preloadで2つを読み込みます。(今回はAsset Packを使いませんでした。)

preload() {
  // タイル画像(Tiled の tileset に使っている画像)
  this.load.image("terrain", "assets/tileset/terrain.png");
  // 🗺️ タイルマップJSON(Tiled からエクスポートしたJSON)
  this.load.tilemapTiledJSON("ground", "assets/map1.json");
  // ...
}

createで処理を書いていきます。

create() {
  // マップを作成(key: preload で読み込んだ "ground")
  const map = this.make.tilemap({ key: "ground" });
  // タイルセットをマップに追加(Tiled 内の名前, Phaser でのキー)
  const tileset = map.addTilesetImage("terrain", "terrain");
  // 地形レイヤー("ground")を表示
  const groundLayer = map.createLayer("ground", tileset, 0, 0);
  // コリジョン設定:Tiled 側で collision: true にしたタイルが対象
  groundLayer.setCollisionByProperty({ collision: true });

  // マップの物理境界(これがないと外に出られてしまう)
  this.physics.world.setBounds(0, 0, map.widthInPixels, map.heightInPixels);
  // プレイヤー生成(座標は例、実際は map.findObject などで取得)
  this.player = this.physics.add.sprite(100, 100, "hero");
  this.player.setCollideWorldBounds(true); // 外に出ないようにする

  // プレイヤーの当たり判定を少し小さく調整
  this.player.body.setSize(12, 12);
  this.player.body.setOffset(2, 4);

  // コリジョンを有効にする(プレイヤーと地形)
  this.physics.add.collider(this.player, groundLayer);

  // カメラ設定
  this.cameras.main.startFollow(this.player, true);
  this.cameras.main.setDeadzone(100, 80); // キャラが画面中心からズレる範囲(デッドゾーン)
  this.cameras.main.setZoom(2); // 2倍に拡大
  this.cameras.main.setBounds(0, 0, map.widthInPixels, map.heightInPixels);
}

まとめ

今回やったこと。

  • Tiledでマップ作成
  • マップの表示
  • 障害物判定(プレイヤーとのコリジョン)
  • ワールド境界の設定(マップ境界を出ない)
  • カメラの追従とズーム