
AI Assisted
この記事は筆者の実装経験をもとに実装コードをベースで執筆し、AIによる校閲・推敲を経て公開しています。
1日目で環境構築とHello Worldまで完了しました。 今日はテトリスの**「盤面(ボード)」**を作っていきます。
テトリスといえば、横10マス × 縦20マスのフィールド。 これをGodotでどう表現するか? 方法はいくつかありますが、今回は2Dゲームの王道機能である**「TileMapLayer(タイルマップレイヤー)」**を使います。
まずはプロジェクトの整理から。
前回作った node_2d.tscn は練習用だったので削除し、新しく本番用の Main シーン を作成しました。
(※Godotではシーンパネルのノードを消しても、ファイル自体は残るので安心です)
次に、「ブロック」の素材を用意します。
今回は 32px × 32px の白い正方形の画像 (block.png) を用意し、プロジェクト内の assets フォルダに配置しました。
Godotは白い画像を用意しておくと、後でプログラムから好きな色(赤や水色)に着色できるので便利だそうです。
これから使う 「TileMapLayer」「TileSet」 と 「画像」 の関係は、お絵かきに例えると分かりやすいです。
| Godotの用語 | お絵かきの例え | 役割 |
|---|---|---|
| 画像 (Texture) | 絵の具のチューブ | ただの素材データ(PNG画像)。まだ使えません。 |
| TileSet | パレット | 絵の具をチューブから出し、使いやすく並べたもの。「この色は32pxの大きさで使う」といったルールを決めます。 |
| TileMapLayer | キャンバス (画用紙) | パレットから色を取って、実際に絵を描く場所。 |
作業の流れ:
ちなみに TileMap という古い情報が出てくることがありますが、Godot 4.3以降は TileMapLayer が推奨されています。Photoshopのレイヤーのように扱えるため、管理がとても楽になっています。
それでは実際に作っていきます。
Main シーンに TileMapLayer(キャンバス)を追加。
<空> となっている「Tile Set」をクリックし、「新規 TileSet」を作成。
block.png をドラッグ&ドロップ。「はい(自動作成)」を選びます。
これで、マウスクリックで画面にブロックを描ける状態になりました!
画面上にテトリスの枠組みを描いていきます。
マウスでポチポチとクリックして描いていきます。お絵かき感覚で楽しい作業です。 描いたあと、ツールバーの「移動モード」を使って、枠組みを画面の中央に配置しました。

見た目はできましたが、ゲームとしては「どこが壁で、どこが空き地か」をデータとして知っておく必要があります。 ここで AI駆動開発 の出番です。Claude Codeを使って、盤面を管理するスクリプトを書いてもらいました。
私からの指示:
Godot 4 (GDScript) でテトリスの盤面を管理する board.gd というスクリプトを書いて。 TileMapLayerを継承して、定数 COLS=10, ROWS=20 を定義。 盤面の状態を管理する2次元配列 grid を用意して、_ready() で初期化して。
AIが生成したコード(抜粋):
# board.gd
extends TileMapLayer
# 盤面サイズ
const COLS: int = 10
const ROWS: int = 20
# セルの状態
enum Cell { EMPTY = 0, WALL = 1, BLOCK = 2 }
# 盤面データ(2次元配列)
var grid: Array = []
func _ready() -> void:
_init_grid()
print("盤面データを初期化しました: %dx%d" % [COLS, ROWS])
func _init_grid() -> void:
grid = []
for y in range(ROWS):
var row: Array = []
for x in range(COLS):
row.append(Cell.EMPTY)
grid.append(row)
# 指定座標のセル状態を取得
func get_cell(x: int, y: int) -> int:
if x < 0 or x >= COLS or y < 0 or y >= ROWS:
return Cell.WALL # 範囲外は壁扱い
return grid[y][x]
# 指定座標にセル状態を設定
func set_cell_state(x: int, y: int, state: int) -> void:
if x >= 0 and x < COLS and y >= 0 and y < ROWS:
grid[y][x] = state
これを TileMapLayer ノードにアタッチして実行すると、出力ログに 「盤面データを初期化しました」 と表示されました。
これで、裏側でデータの準備(ゲームの脳みそ)が整ったことになります。
今回使った言語は GDScript(ジーディスクリプト) と言います。 Pythonによく似た文法で、Godot専用に作られたプログラミング言語です。
extends TileMapLayer や Vector2 といったゲーム制作に必要な機能が最初から組み込まれています。.gd で保存されます。開発中に「シーン」という言葉が何度も出てきましたが、これはGodotの最重要概念です。 一言で言うと、**「ゲームの部品をひとまとめにしたパック」**です。
Godotでは、タイトル画面も、マリオのようなキャラも、ステージそのものも、すべて「シーン」として作ります。
もしReactやVue.jsの経験があるなら、「Godotのシーン = Webのコンポーネント」 と考えると一発で分かります。
| 概念 | Web開発 (React/Vue) | Godot Engine |
|---|---|---|
| 構成単位 | Component (Button.jsx) | Scene (Button.tscn) |
| 全体構造 | DOMツリー | シーンツリー |
| 実体の生成 | レンダリング | インスタンス化 |
今回は親コンポーネントである Main シーンを作りました。次回作る「ブロック」は、子コンポーネントとしてここに配置することになります。
Hello World用のファイルは削除し、テトリス用にフォルダ構成を整理しました。
godot-tetris-practice/
├── .godot/ # 内部キャッシュ(Git除外)
├── assets/
│ └── block.png # 追加:32x32 白ブロック画像(着色用)
├── scenes/
│ └── main.tscn # 追加:メインシーン(TileMapLayer配置済み)
├── script/
│ └── board.gd # 追加:盤面データ管理用スクリプト
├── project.godot # プロジェクト設定
└── icon.svg # アプリアイコン
今日はステージ(箱)を作りました。 次回は、いよいよ**「テトリミノ(ブロック)」**を作成し、ボタン操作で動かすところまで進めます!
スポーツ×ITの会社でバックエンドエンジニア兼マネージャーとして勤務。インテル関連の情報を中心に、AI・IT技術やサイト運用ノウハウも発信しています。
最終更新: 2026年1月12日
© 2025 nero15.dev. All rights reserved.