PYTHON RETRO GAME ENGINE
自分だけのレトロゲームを作ろう
「Pyxel」入門ガイド_
ドット絵と8bitサウンドで動く、小さくて自由なゲーム作りの世界へ。プログラムが初めての人でも、AIチャットを相棒にしながら、ステージを1つずつクリアする感覚で読み進められます。

Pyxel(ピクセル)は、プログラミング言語 Python で動く、無料のレトロゲームエンジンです。むずかしい専門用語はできるだけ使わず、この記事を読み終える頃には「動くゲーム」が自分の手で作れるところまで、一気に案内します。インストールのやり方から、画面・音・当たり判定、実際に遊べるサンプルゲーム、そしてChatGPTやClaudeのようなAIチャットを相棒にしたコード作りのコツまで、ステージを進むように学んでいきましょう。
Pyxelってなに?
Pyxelは、日本人エンジニアのkitaoさんが作った、オープンソースのゲームエンジンです。「オープンソース」というのは、作り方の設計図(プログラムのコード)がGitHubで世界中に公開されていて、誰でも無料で使ったり、改造したりできる、という意味です。
画面がカクカクした四角いドット(マス目)でできていて、色の数も少ない、昔のファミコンやゲームボーイのようなゲームのことです。今のなめらかなゲームとは違う、あたたかい雰囲気が魅力です。
Pyxelが選ばれる理由
① おどろくほどシンプルな命令
「画面を作る」「文字を出す」「絵を表示する」といった動作が、それぞれ1行のコードで書けるように設計されています。覚えることが少ないので、最初のつまずきが起きにくいのが特長です。
② わざと不便にして生まれる味わい
- 画面の大きさは最大でも256×256ドット(よく使われるのは160×120くらいの小さめサイズ)
- 使える色は基本16色だけ(自分で色を変えることもできます)
今どきのゲームからすると不便に思えるかもしれませんが、この「制限」こそが、ファミコンやゲームボーイのような、なつかしくてあたたかい雰囲気を生み出しています。
③ どのパソコンでも動く
Windows・macOS・Linuxのどれでも、Pythonが動く環境さえあれば同じように遊べます。
④ 絵も音もぜんぶ1つのアプリで
ターミナルからpyxeleditorと入力するだけで専用エディタが立ち上がり、ドット絵・マップ・効果音・音楽をまとめて作れます。詳しくはステージ09で解説します。
⑤ 仲間とサンプルが豊富
GitHub上のPyxel公式リポジトリには、世界中の人が作ったサンプルコードや作品が公開されています。困ったときに参考にできる情報が多いのも、学びやすさにつながっています。
同じPythonゲーム制作の実例Arduino×Pygameのジャンプゲーム開発は、生成AIを使うとどこまで速くなるのか。
はじめよう:インストール
Pyxelは、PythonのパッケージとしてPyPIで配布されています。まだPythonを入れていない場合はPython公式サイトから先にインストールしておきましょう。準備ができたら、ターミナル(またはコマンドプロンプト)を開いて、次のコマンドを打ち込むだけで準備完了です。
pip install pyxel
venvやcondaなどの仮想環境を使っている人は、その環境をアクティブにした状態で実行してください。仮想環境の作り方はPython公式ドキュメントのvenvガイドが参考になります。
インストールがうまくいったかどうかは、次のコマンドで確認できます。バージョン番号が表示されれば成功です。
python -c "import pyxel; print(pyxel.__version__)"
コードを書くエディタに迷ったら、無料で使えるVisual Studio Codeがおすすめです。Python拡張機能を入れるだけで、補完やエラー表示がすぐに使えるようになります。
最初の一歩:最小プログラム
まずは「画面を開いて、文字をひとつ表示するだけ」の、いちばん小さなプログラムから始めましょう。
import pyxel
def update():
# 毎フレーム呼ばれる、ゲームの状態を更新する場所
pass
def draw():
# 毎フレーム呼ばれる、画面を描く場所
pyxel.cls(0) # 画面を色0(黒)でクリア
pyxel.text(50, 40, "Hello, Pyxel!", 7) # (x, y, 文字, 色)
pyxel.init(160, 120, caption="Hello Pyxel") # 画面の幅・高さ・タイトル
pyxel.run(update, draw)
pyxel.initで画面を用意し、pyxel.run(update, draw)を呼ぶと、そこから先はupdate → drawの順番が、ゲームが終わるまで自動でくり返されます。ファイルを保存して、python hello_pyxel.pyを実行すると、レトロな雰囲気のウィンドウに「Hello, Pyxel!」の文字が表示されます。
画面と色のひみつ
画面の大きさ
Pyxelの画面サイズは自由に決められますが、レトロっぽさを出したいなら160×120くらいの小さいサイズがおすすめです(最大でも256×256まで)。画面を大きくするほど今どきのゲームに近づき、レトロ感はうすくなります。
使える16色
Pyxelには、あらかじめ16色のパレット(色の一覧)が用意されています。番号(カラーID)を指定するだけで、その色を使うことができます。このパレットは往年の家庭用ゲーム機の配色を思わせる、レトロで統一感のある色づかいが特徴です。
残りのID 8〜15にも、赤やオレンジ、水色などが割り当てられています。数字を1つ変えるだけで、絵の印象がガラッと変わるのも楽しいポイントです。
色に名前ではなく「番号」がついている、と考えるとわかりやすいです。pyxel.text(50, 40, "Hello", 7)の最後の7は「白色(7番の色)で文字を書いてね」という意味です。
ゲームの心臓部:update と draw
Pyxelのゲームは、次の2つの関数を1秒間に何十回もくり返すことで動いています。
- update() — キー入力のチェックや、キャラクターの位置計算など、「頭で考える」部分
- draw() — 考えた結果を、画面に絵として映し出す「見た目」の部分
この2つを用意してpyxel.run()に渡すだけで、ゲームらしい動きが自動的に生まれます。むずかしい仕組みを自分で組む必要がないのが、Pyxelの気持ちいいところです。この「決まった間隔で状態を更新し、描画する」考え方はゲームループと呼ばれ、ジャンルを問わず多くのゲームエンジンで採用されている基本設計です。
操作をつくる:キー・マウス
プレイヤーの操作は、次のようなコードで受け取ります。
if pyxel.btn(pyxel.KEY_LEFT):
# 左キーが押され「続けている」間ずっとTrue
player_x -= 1
if pyxel.btnp(pyxel.KEY_SPACE):
# スペースキーが「押された瞬間」だけTrue
jump()
pyxel.btn(キー)……押されている間ずっと反応(歩く、走るなどに向いている)pyxel.btnp(キー)……押した瞬間だけ反応(ジャンプ、決定ボタンなどに向いている)
マウスやゲームパッドにも対応していて、同じ考え方で座標やボタンの状態を取得できます。
mx = pyxel.mouse_x
my = pyxel.mouse_y
if pyxel.btn(pyxel.MOUSE_BUTTON_LEFT):
do_something()
絵を描いて動かす
イメージバンクという「絵の保管庫」
Pyxelの中には、キャラクターや背景の絵をしまっておくイメージバンクという場所があります。標準では0〜2番の3つが用意され、それぞれ256×256ドットぶんの絵を保存できます。
絵を画面に貼りつける
保管庫にしまった絵を画面に映すには、pyxel.blt(ブリット=貼りつけ、の意味)という命令を使います。
pyxel.blt(x, y, img, u, v, w, h, colkey)
# 例:
pyxel.blt(10, 20, 0, 0, 0, 16, 16, 0)
x, y……画面のどこに貼るかimg……使うイメージバンクの番号(0〜2)u, v, w, h……保管庫のどの範囲を切り取るか(左上の座標と、幅・高さ)colkey……この色は透明にする、という指定(不要なら-1)
上の例は「イメージバンク0の、左上(0,0)から16×16ドットぶんを切り取り、画面の(10,20)に、色0を透明にして貼る」という意味になります。
音を鳴らす
Pyxelは、正弦波や矩形波といったシンプルな音の波形を組み合わせて、なつかしい8bitサウンドを作ることができます。効果音や曲のデータは「サウンドバンク(0〜63番)」に保存し、番号を指定して呼び出します。
# チャンネル0で、サウンド番号0を再生する
pyxel.play(0, 0)
- チャンネル:0〜3の4本の再生レーンがあり、同時に音を鳴らせます
- サウンド番号:あらかじめ用意しておいた音のデータ番号
音づくり自体は、次に紹介するPyxel Editorの中で、耳で確かめながらGUIで作るのがいちばん簡単です。
Pyxel Editorで創作
ターミナルで次のコマンドを打つと、絵・マップ・音・曲をまとめて作れる専用エディタが起動します。
pyxeleditor
画面は4つのタブに分かれています。
| タブ | できること |
|---|---|
| Image | ペン・消しゴム・塗りつぶしで、ドット絵を1マスずつ描く |
| Tilemap | 描いた絵をパーツのように並べて、ステージの地形を作る |
| Sound | 音の高さ・長さ・音色を調整して、効果音を作る |
| Music | 作った音(Sound)を並べて、1曲のBGMに組み立てる |
作ったデータは.pyxresという1つのファイルにまとめて保存され、ゲーム側ではpyxel.load("assets.pyxres")のように読み込んで使います。もっと作例を見たい人は、Pyxel User Examples(GitHub Wiki)もあわせてチェックしてみてください。完成した作品はitch.ioのようなインディーゲーム投稿サイトで公開することもできます。
マップでステージ作り
広いステージを作るときは、絵を1枚ずつ置くのではなくタイルマップを使うと効率的です。小さな絵(タイル)を、方眼紙のマス目に並べていくイメージです。
pyxel.tilemaps[0].pset(x, y, tile)……プログラムから、指定のマスにタイルを置くpyxel.bltm(x, y, tm, u, v, w, h)……タイルマップをまとめて画面に描画する
Pyxel Editorの Tilemap タブを使えば、マウスでタイルをクリックして並べるだけなので、プログラムを書かなくても直感的にステージを組み立てられます。
ぶつかったを判定する
Pyxel自体には「当たり判定」専用の命令は用意されていません。ですが、小さめのレトロゲームなら、四角形どうしが重なっているかを調べる矩形どうしの交差判定(AABB)だけで十分実用的です。
def check_collision(x1, y1, w1, h1, x2, y2, w2, h2):
return not (
x1 + w1 < x2 or x2 + w2 < x1 or
y1 + h1 < y2 or y2 + h2 < y1
)
if check_collision(px, py, pw, ph, ex, ey, ew, eh):
player_hp -= 1
キャラクターが増えてきたら、座標・速度・当たり判定用のサイズなどを1つのクラスにまとめておくと、コードが整理しやすくなります。
実践!よけゲームを作る
ここまでの内容を組み合わせて、「左右キーで動き、上から降ってくる敵を避け続ける」ミニゲームを作ってみましょう。
import pyxel
import random
class App:
def __init__(self):
pyxel.init(160, 120, caption="Avoid Game")
self.reset()
pyxel.run(self.update, self.draw)
def reset(self):
self.player_x = 80
self.player_y = 100
self.enemies = []
self.score = 0
self.game_over = False
def update(self):
if self.game_over:
if pyxel.btnp(pyxel.KEY_R):
self.reset()
return
if pyxel.btn(pyxel.KEY_LEFT):
self.player_x -= 2
if pyxel.btn(pyxel.KEY_RIGHT):
self.player_x += 2
self.player_x = max(0, min(self.player_x, pyxel.width - 8))
if random.random() < 0.02:
self.enemies.append([random.randint(0, pyxel.width - 8), 0])
for e in self.enemies:
e[1] += 2
self.enemies = [e for e in self.enemies if e[1] < pyxel.height]
for e in self.enemies:
if abs(e[0] - self.player_x) < 8 and abs(e[1] - self.player_y) < 8:
self.game_over = True
break
self.score += 1
def draw(self):
pyxel.cls(0)
if not self.game_over:
pyxel.text(5, 5, f"SCORE {self.score}", 7)
pyxel.rect(self.player_x, self.player_y, 8, 8, 11)
for e in self.enemies:
pyxel.rect(e[0], e[1], 8, 8, 8)
else:
pyxel.text(58, 50, "GAME OVER", 8)
pyxel.text(40, 62, f"SCORE {self.score}", 7)
pyxel.text(34, 76, "PRESS R TO RETRY", 7)
App()
四角形を並べているだけのシンプルなゲームですが、pyxel.rectの部分をステージ07で紹介したpyxel.bltに差しかえれば、そのままドット絵キャラクターのゲームに発展させられます。
うまく動かない時は
- ログを出してみる:
print()で変数の中身を表示すると、どこで想定とズレているかが見えてきます - 小さく分ける:プレイヤー、敵、弾などを別々のクラスに分けると、原因を探す範囲がせまくなります
- 動きをゆっくり確認する:Pyxelに一時停止機能はないので、フレームごとの待ち時間を自分で調整して観察するのも有効です
- 素材はエディタで一元管理:絵や音をバラバラに管理すると事故のもと。Pyxel Editorでまとめておくとミスが減ります
- エラー文をそのまま検索・質問する:Stack OverflowやAIチャットにエラーメッセージを貼りつけると、原因の見当がつきやすくなります
AIとのデバッグ術をあわせて学ぶ【2026年版】AIを用いたArduinoのコードの書き方|基礎から応用まで全てがわかる初心者の手引き
似ているツールと比較
Pythonやレトロゲーム向けのツールは他にもあります。目的に合わせて選ぶ参考にしてください。
| ツール | 特徴 | 向いていること |
|---|---|---|
| Pyxel | 16色パレット・最大256×256・専用エディタ完備・命令がシンプル | 小〜中規模のレトロゲーム開発 |
| Pygame | Pythonゲーム制作の定番。自由度は高いが、レトロ表現は自分で作り込む必要あり | ジャンルを問わない幅広いゲーム制作 |
| PICO-8 | Lua言語ベースの仮想コンソール。128×128固定・16色 | Pyxelと似た、制限つきレトロ表現 |
| LÖVE(love2d) | Luaベースで、機能の制限が少ない | 2Dゲーム全般や試作(プロトタイプ) |
「Pythonで書きたい」「エディタも込みで手軽に始めたい」「レトロな制限を楽しみたい」という人には、Pyxelがいちばんフィットしやすい選択肢です。Pygameでの実装イメージを先に見ておきたい人は、以下の記事もあわせてどうぞ。
Pygameでの表現の幅を知る【コピペ可】色(カラー)、デザインの変化を自由自在に操る|VRレンズ風デジタルアート、Python、Pygame
AIと一緒に作ろう
Pyxelでのゲーム作りは、ChatGPTやClaudeのようなAIチャットを相棒にすると、ぐっと進めやすくなります。全部を自分で覚えていなくても、「どう書けばいいか」をAIに聞きながら手を動かせるのが、今どきの開発スタイルです。
AIに頼れる場面
- コードを書いてもらう:「敵がプレイヤーを追いかける動きを書いて」のように頼むと、たたき台のコードが返ってきます
- エラーの意味を教えてもらう:赤いエラー文をそのまま貼りつけて「これはどういう意味?」と聞くだけでOKです
- アイデア出しを手伝ってもらう:「小学生が喜ぶ敵キャラのアイデアを5つ」のように、企画の相談相手にもなります
- ドット絵の配色案をもらう:Pyxelの16色パレットを伝えて、「勇者っぽいキャラに合う色の組み合わせは?」と聞くのも有効です
Pyxelで、敵キャラがプレイヤーの座標に
向かって少しずつ近づいてくるコードを
書いてください。すでにある player_x,
player_y, enemy_x, enemy_y を使って、
update() の中に入れられる形でお願いします。
このように「今の変数名」「入れたい場所」「やりたい動き」を具体的に伝えるほど、そのままコピーして試せるコードが返ってきやすくなります。
AIはとても頼りになりますが、まちがえることもあります。もらったコードは、まずpython ファイル名.pyで実際に動かしてみて、思った通りに動くか自分の目でたしかめる習慣をつけましょう。「なぜこう書くのか」を1行ずつ声に出して読んでみると、理解もぐっと深まります。
Pyxelでよく使う関数チートシート
ここまで登場した命令を中心に、開発中に手元で見返せるチートシートとしてまとめました。ブックマークしておくと、コードを書くときに便利です。
| 分類 | 関数 | 役割 |
|---|---|---|
| 初期化 | pyxel.init(w, h) |
画面の幅・高さなどを指定してウィンドウを作成 |
| 実行 | pyxel.run(update, draw) |
update→drawのゲームループを開始 |
| 描画 | pyxel.cls(col) |
画面を指定色で塗りつぶしてクリア |
| 描画 | pyxel.rect(x, y, w, h, col) |
塗りつぶした四角形を描く |
| 描画 | pyxel.text(x, y, s, col) |
文字列を表示する |
| 描画 | pyxel.blt(x, y, img, u, v, w, h, colkey) |
イメージバンクの絵を画面に貼りつける |
| 描画 | pyxel.bltm(x, y, tm, u, v, w, h) |
タイルマップをまとめて描画 |
| 入力 | pyxel.btn(key) |
押されている間ずっとTrue |
| 入力 | pyxel.btnp(key) |
押された瞬間だけTrue |
| 入力 | pyxel.mouse_x / mouse_y |
マウスカーソルの座標を取得 |
| 音 | pyxel.play(ch, snd) |
指定チャンネルでサウンドを再生 |
| ファイル | pyxel.load("file.pyxres") |
Pyxel Editorで作った素材ファイルを読み込む |
すべての関数の詳細な仕様は、Pyxel公式ドキュメント(日本語版)のAPIリファレンスで随時確認できます。
よくある質問
Pyxelはプログラミング未経験でも使えますか?
Python自体が初めての場合は、変数・if文・for文といった基本文法を先に軽くさわっておくと理解がスムーズです。とはいえPyxelの命令自体は非常にシンプルなので、簡単な入門書やチュートリアルを一つ終えた程度の知識があれば、この記事の内容には十分ついていけます。
作ったゲームをスマホやブラウザで遊べるようにできますか?
Pyxelには、作品をWeb(ブラウザ)用に書き出す機能が用意されており、HTMLファイルとして出力すればブラウザ上で遊べる形にできます。手順の詳細は公式ドキュメントのWeb出力の項目を参照してください。
PyxelとPygame、結局どちらを選べばいいですか?
「まずは手早く1本完成させたい」「レトロな見た目を楽しみたい」ならPyxel、「解像度や色数の制限なく、幅広いジャンルを自由に作りたい」ならPygameが向いています。ステージ14の比較表もあわせて参考にしてください。
無料で商用利用してもよいのでしょうか?
PyxelはMITライセンスで公開されており、商用・非商用を問わず無料で利用できます。ただし配布する素材(絵・音楽など)に第三者の著作物を使う場合は、その素材側のライセンスを別途確認してください。
画面がカクついたり重くなったりするのはなぜですか?
敵や弾の数が増えすぎている、当たり判定の計算量が多すぎる、といった原因が多いです。ステージ13で紹介した「小さく分けて確認する」方法で、どの処理が重いのかを切り分けてみましょう。
🏆 STAGE CLEAR
Pyxelは、Pythonの知識を使って、あの頃のゲームの手ざわりを再現できる、小さくて自由なゲームエンジンです。updateとdrawという2つの関数を用意するだけでゲームループが成立し、専用エディタを使えばドット絵・マップ・サウンドまで1つの流れで作れます。
当たり判定などは自分で組み立てる必要がありますが、そのぶん「ゲームがどう動いているか」を基礎から学べるのも、Pyxelならではの良さです。わからないところはAIチャットに相談しながら進めれば、一人でもつまずきにくくなります。
次に挑戦したい応用アイデア
- アクションゲーム:タイルマップでステージを組み、敵AIやボス戦を追加してみる
- 弾幕シューティング:大量の弾を管理しつつ、処理落ちしない工夫を考える
- パズルゲーム:ブロックの移動・回転を実装して、落ち物ゲームに挑戦する
- ミニRPG:タイルマップ+会話ウィンドウ+イベントで物語を作る
- 通信対戦・ランキング:Pythonのネットワーク機能でスコアを共有する
- AIとの共同制作:ストーリーやセリフのたたき台をAIに考えてもらい、自分の言葉で仕上げる
まずは今日のサンプルコードを少しだけ書きかえてみるところから。AIという頼れる相棒を借りつつ、自分だけのドット絵と音で、世界に1つのレトロゲームを育てていきましょう。
コメント