SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Godot Engine 2Dゲーム開発入門

【Godot Engine 2Dゲーム制作 Part2】「オリジナル迷路ゲーム」の迷路をつくろう

Godot Engine 2Dゲーム開発入門 第4回

  • X ポスト
  • このエントリーをはてなブックマークに追加

床や壁のシーンを作ろう

床や壁の構造

 続いて床や壁のシーンを作ります。「ファイルシステム」ドックにres://scn/floorフォルダーを作ります。この中に次のシーンを作成します。

  • floor.tscn …… 床
  • start.tscn …… スタート
  • goal.tscn …… ゴール
  • wall.tscn …… 壁マス

床のシーン

 まずは床のシーンを作りましょう。

 ルートノードは「Sprite2D」にして名前を「Floor」に変更します。「Ctrl+S」で保存するパスはres://scn/floor/floor.tscnとします。

 「Floor」(Sprite2D)の「インスペクター」ドックには、次のような変更を加えます。

  • 「Sprite2D」
    • 「Texture」に、res://res/image/dot/floor.pngをドロップ
Sprite2D
Sprite2D

スタートのシーン

 次はスタートのシーンを作ります。床のシーンと同じです。

 ルートノードは「Sprite2D」にして名前を「Start」に変更します。「Ctrl+S」で保存するパスはres://scn/floor/start.tscnとします。

 「Start」(Sprite2D)の「インスペクター」ドックには、次のような変更を加えます。

  • 「Sprite2D」
    • 「Texture」に、res://res/image/dot/start.pngをドロップ
Sprite2D
Sprite2D

ゴールのシーン

 次はゴールのシーンを作ります。床やスタートより少し複雑です。

 ルートノードは「Area2D」にして名前を「Goal」にします。「Ctrl+S」で保存するパスはres://scn/floor/goal.tscnとします。

 「Goal」ノードに子ノードとして「Sprite2D」と「CollisionShape2D」を追加します。配置後の状態は次のようになります。

▶ Goalシーン

  • Goal(Area2D)
    • Sprite2D
    • CollisionShape2D

 「Goal」(Area2D)には変更を加えません。

 「Sprite2D」の「インスペクター」ドックには、次のような変更を加えます。

  • 「Sprite2D」
    • 「Texture」に、res://res/image/dot/goal.pngをドロップ

 また「CollisionShape2D」の「インスペクター」ドックには、次のような変更を加えます。

  • 「CollisionShape2D」
    • 「Shape」で「新規RectangleShape2D」を選択
    • 画像の状態になるようにシェイプの形状を調整
Goal(Area2D)
Goal(Area2D)

 この四角のシェイプは小さめにします。大きくすると、ゴールのマスに入った瞬間にプレイヤーがゴールした表示になってしまいます。小さくすることで、マスの中ほどまでプレイヤーが達したタイミングでゴールの表示を出せます。

 「Goal」シーンのシグナルは、ここでは設定しません。「Maze」シーンのスクリプト(maze.gd)で、シグナルの発信と受信を書きます。

壁のシーン

 次は壁のシーンを作ります。壁のシーンは、ゴールのシーンと似ています。

 ルートノードは「StaticBody2D」にして名前を「Wall」にします。「Ctrl+S」で保存するパスはres://scn/floor/wall.tscnとします。

 「StaticBody2D」は、衝突する物体を表現する「PhysicsBody2D」を継承したノードで、壁などの固定物に適しています。

 「Wall」ノードに子ノードとして「Sprite2D」と「CollisionShape2D」を追加します。配置後の状態は次のようになります。

▶ Wallシーン

  • Wall(StaticBody2D)
    • Sprite2D
    • CollisionShape2D

 「Wall」(StaticBody2D)には変更を加えません。

 「Sprite2D」の「インスペクター」ドックには、次のような変更を加えます。

  • 「Sprite2D」
    • 「Texture」に、res://res/image/dot/wall.pngをドロップ

 また「CollisionShape2D」の「インスペクター」ドックには、次のような変更を加えます。

  • 「CollisionShape2D」
    • 「Shape」で「新規RectangleShape2D」を選択
    • 画像の状態になるようにシェイプの形状を調整

 この四角のシェイプは壁の外周に沿うようにします。これは壁に侵入できないようにするためです。

Wall(StaticBody2D)
Wall(StaticBody2D)

 「Wall」シーンのシグナルは設定しません。

 「CharacterBody2D」や「StaticBody2D」といった「PhysicsBody2D」を継承したノードは物理の影響を受けます。これらはmove_and_slideのような固有の関数で、自動で動きを制御できます。

 特殊な処理が必要ないなら、何も設定しなくてよいです。

コリジョンについて

 「Wall」(StaticBody2D)のノードの「インスペクター」ドックを見ると「CollisionObject2D」>「Collision」に「Layer」と「Mask」という項目があります。そして、それぞれ1~8までの数字が書かれたパネルが並んでいます。

Collision
Collision

 「Collision」>「Layer」は、このノードが所属している物理レイヤーです。この物理レイヤーを、ビルの各階に例えるなら、自分が何階にいるかを表しています。

 「Collision」>「Mask」は、衝突判定を行う物理レイヤーです。この物理レイヤーを、ビルの各階に例えるなら、何階の相手に対して衝突判定をおこなうかを表しています。

 「Collision Layer」が「1」で、「Collision Mask」が「1」なら、自分自身は物理レイヤー「1」にいて、物理レイヤー「1」にいる相手に対して衝突判定をおこないます。

 「Collision Layer」が「1」で、「Collision Mask」が「2」なら、自分自身は物理レイヤー「1」にいて、物理レイヤー「2」にいる相手に対して衝突判定をおこないます。

 こうした設定を使えば、自分の撃った弾は敵だけに当たり、敵が撃った弾は自分だけに当たるといった状態を表現できます。

次のページ
迷路の各マスを配置しよう1

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Godot Engine 2Dゲーム開発入門連載記事一覧

もっと読む

この記事の著者

柳井 政和(ヤナイ マサカズ)

クロノス・クラウン合同会社 代表社員http://crocro.com/オンラインソフトを多数公開。プログラムを書いたり、ゲームを作ったり、記事を執筆したり、マンガを描いたり、小説を書いたりしています。「めもりーくりーなー」でオンラインソフト大賞に入賞。最近は、小説家デビューして小説も書いています(『裏切りのプログラム』他)。面白いことなら何でもOKのさすらいの企画屋です。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/21372 2025/07/04 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング