Tutorials
Tutorials

This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this tutorial in English

RPG マップ - サンプルプロジェクト

エディターから開くか、GitHub からダウンロードできるこのサンプルプロジェクトでは、Defold で非常に大きな RPG マップを作成する方法の1つを紹介します。この設計は、次の前提に基づいています。

  1. ワールドは1画面ずつ表示します。これにより、ゲームでは敵や NPC キャラクターを1つの画面の範囲内に自然に収められます。レベルデザイナーは、プレイヤーの画面にワールドがどのように表示されるかを完全に制御できます。
  2. プレイヤーキャラクターがどれだけ遠くに移動しても、ゲームで浮動小数点の精度の問題が発生しないようにします。この問題は通常、オブジェクトが原点から遠く離れると、不自然に震える原因になります。
  3. プレイヤーの移動はマップ上の障害物によって制限されるため、レベルデザイナーは木、岩、水などの障害物を使って、画面間を移動するプレイヤーを誘導できます。
  4. タイルマップ(tilemap)、スプライト(sprite)、その他の表示コンテンツを組み合わせられるようにします。

まずサンプルを実行し、3x3画面分の広さのワールドを歩き回って、サンプルの構成をつかみましょう。キャラクターは矢印キーで操作します。

メインコレクション

“/main/main.collection” を開いて、このサンプルで起動時に読み込まれるコレクション(collection)である、ブートストラップコレクション(bootstrap collection)を確認します。

メインコレクションには、矢印キーで8方向に操作するプレイヤーキャラクターのゲームオブジェクト(game object)と、ゲームの進行を制御する “game” という2つ目のゲームオブジェクトが含まれています。”game” オブジェクトは、スクリプト(script)と、ゲーム内の各画面に1つずつ用意したコレクションファクトリー(collection factory)で構成されています。ファクトリーには、画面のグリッドの命名規則に従って名前が付けられています。

スクリプト “/main/game.script” は、プレイヤーが現在どの画面にいるかを追跡します。また、”load_screen” というカスタムメッセージにも反応します。このメッセージは新しい画面を読み込み、主人公が移動する方向に現在の画面と入れ替えます。初期状態では、1つの画面が表示領域の中央に読み込まれ、位置を入れ替える相手の画面はありません。

画面の切り替え

主人公はスクリプト “/main/hero.script” で制御します。このスクリプトは、主人公のゲームオブジェクトが、画面の端に近い上下左右の境界線を越えたかどうかを確認します。

  1. 主人公が画面の端に十分近づくと、次の画面を読み込むためのメッセージを “game” オブジェクトのスクリプトに送信します。
  2. 適切な collectionfactory コンポーネント(component)に対して factory.create() を呼び出して、次の画面のコレクションを生成します。コレクションの内容は画面外に配置します。
  3. 次の画面を表示領域の中央へスクロールさせ、現在の画面をその反対方向へスクロールさせて表示領域の外に出します。プレイヤーキャラクターも同じ距離、同じ速度でスクロールさせます。
  4. 画面外に出た、それまでの現在の画面を削除し、次の画面を新しい現在の画面にします。
  5. 主人公が新しい画面の表示領域内に入るようにアニメーションし、プレイヤーが再び操作できるようになります。

これらすべてが1秒以内に行われるため、切り替えは滑らかで、プレイを妨げません。

画面

ゲームワールドの各画面は、それぞれ独立したコレクション内に構築されます。コレクションには、その画面固有のタイルマップ、衝突判定や物理特性を持つコリジョンオブジェクト(collision object)、その他のゲームオブジェクトが含まれます。画面の管理と読み込みを容易にするため、画面のコレクションには簡単な規則に従って名前を付けています。

各画面のコレクションは、ワールドのグリッド内での位置に従って名前を付けます。最初の数字はグリッドの X 位置で、2つ目の数字は Y 位置です。

Assets ビューで、マップの左下隅にある画面を定義するコレクション “/main/screens/0-0.collection” に移動して開きます。

“root” という名前のゲームオブジェクトがあり、画面内のすべてのコンテンツの親になっていることに注目してください。これもこのサンプルで使っている規則で、非常に重要な役割があります。画面を表示領域に移動するときは、”root” ゲームオブジェクトだけを動かせばよいのです。すべての子オブジェクトは、親であるルートとともに自動的に移動します。画面に特別なゲームオブジェクトがある場合も、その移動は親であるルートを基準とするため、自由にアニメーションさせられます。画面がスクロールして入ってくるときや出ていくときに、これらの子オブジェクトも画面とともに移動します。特別なコードが必要になるのは、オブジェクトが画面間を移動する必要がある場合だけです。

画面 0-1 の蜂は、この考え方を示す簡単な例です。

ワールド全体とのつながりを確認しながら画面を編集する

各画面には独自のタイルマップがあり、組み込みのタイルマップエディターで編集できます。ただし、各画面を個別に編集する方法の大きな欠点は、隣接する画面とどのようにつながるかを簡単には確認できないことです。このつながりは、ゲームワールド全体の連続性を作るうえで重要です。

そのため、専用のコレクションを作成しました。”/main/map/test_layout.collection” を開いて、このワールドのテストレイアウト用コレクションを確認します。

このコレクションの唯一の目的は、開発中の編集ツールとして使うことです。特定の画面をテストレイアウト用コレクションと並べて編集すると、作業中の画面と周囲とのつながりが分かり、編集がずっと快適になります。

画面のタイルマップ(ここでは右側のペイン)への編集は、テスト用コレクション(左側のペイン)に即座に反映されます。また、テストレイアウト用コレクションは静的な階層に追加されていないため、すべてのビルドから自動的に除外されることにも注目してください。

まとめ

ここまで見てきたように、このサンプルは、ゲームワールドと、その中を主人公がどのように移動するかに関する特定の制約に従って構築されています。ゲームの要件が異なる場合は、おそらく別の解決策を見つける必要があります。たとえば、ワールドマップ上でカメラを継ぎ目なく移動させる必要があるゲームでは、コンテンツを分割する方法も、読み込みの仕組みも、ゲームワールドの制作を支援するツールも変える必要があります。

これで RPG マップサンプルの解説は終わりです。いつものように、サンプルのコンテンツは、目的に合わせて自由に利用できます。Defold について詳しく知るには、ドキュメントのページで、ほかのサンプル、チュートリアル、マニュアル、API ドキュメントを確認してください。

問題が発生した場合や質問がある場合は、フォーラムをご利用ください

Defold での開発を楽しんでください!