【Pyxel】Pythonでレトロゲーム作成

Python

最近のゲームは超リアルで、没入感がとんでもない作品が多く作られていますが、一昔前のレトロゲームはそのドット絵の見た目、ピコピコ音から何とも言えない懐かしさを感じさせてくれます(自分はギリギリ世代ではないですが)

PythonにはPygame等の有名ゲームエンジンがありますが、今回紹介するのはPyxelというレトロゲームに特化したPythonのゲームエンジンです。

kitao/pyxel
A retro game engine for Python. Contribute to kitao/pyxel development by creating an account on GitHub.

こちらが作者のgithubです。

Pyxelの特徴

仕様等はgithubを見ていただければわかると思いますが、Pythonがある環境でPyxelをインストールし、コード内でPyxelモジュールをインポートすればすぐに使えます(自分はWindowsです)

特徴としては

  • Pythonで記述できる
    Pythonは機械学習に使われるため、自分が学んでいたこともあり手が付けやすかったです。
  • マルチプラットフォーム対応
    Windows, Mac, Linux、ツールによりPythonがインストールされていなくても動作可能です。先ほど述べた通り自分はWindows環境での実行しかしていないので他はわからずです。
  • 専用ツールが同梱
    絵を作成するエディタ、メロディーを作成するエディタが同梱されているので、自分でオリジナルキャラを作成できますし、自分で楽しむだけならば、既存のゲーム、アニメキャラを作成するのも面白そうです。
  • 無料
    無料、つまりただです。神

サンプルコード

公式がいくつかのサンプルコードを公開してくれています。以下コード

import pyxel


class App:
    def __init__(self):
        pyxel.init(160, 120, caption="Hello Pyxel")
        pyxel.image(0).load(0, 0, "assets/pyxel_logo_38x16.png")
        pyxel.run(self.update, self.draw)

    def update(self):
        if pyxel.btnp(pyxel.KEY_Q):
            pyxel.quit()

    def draw(self):
        pyxel.cls(0)
        pyxel.text(55, 41, "Hello, Pyxel!", pyxel.frame_count % 16)
        pyxel.blt(61, 66, 0, 0, 0, 38, 16)


App()

コマンドでSS(alt+1),gif(alt+2で開始、alt+3で終了)を取ることもできます。すごい

initで初期状態(画面サイズ、タイトル)を決定、runで実行
updateでフレームごとに判定を行い、drawで画面描画をしています。このコードはdrawのみのコード(updateはQキーを押したら終了するのみ)

pyxel.cls(色)で画面背景の色を初期化し、
pyel.text(x, y, “text”, color(0-15))で文字と色を指定し、
pyxel.blt(x, y, img, u, v, w, h, [colkey])で画像を読み込んでいます。 詳しくはAPIリファレンスにて

こちらのコードは”Hello Pyxel!”の文字がフレームごとに色変化するようになっています。frame_countは経過フレーム数です。frame_count % 16 にて1frameごとに色が変化していくようですね。変化が速すぎて実際の目には16色あるようには見えないですが(笑)

簡単に操作に慣れるためにこちらのコードを少しいじってみます。

import pyxel


class App:
    def __init__(self):
        pyxel.init(160, 120, caption="Hello Pyxel")
        self.x = 55
        pyxel.image(0).load(0, 0, "assets/pyxel_logo_38x16.png")
        pyxel.run(self.update, self.draw)

    def update(self):
        self.x = self.x + 1
        if self.x > pyxel.width:
            self.x = -50
        if pyxel.btnp(pyxel.KEY_Q):
            pyxel.quit()

    def draw(self):
        pyxel.cls(0)
        pyxel.text(self.x, 41, "Hello, Pyxel!", pyxel.frame_count % 16)
        pyxel.blt(61, 66, 0, 0, 0, 38, 16)


App()

文字のx座標を変数に置き換えてフレームごとにxが増加するように描画することで文字が動くようになりました。pyxel.widthは画面幅でself.xがこれを超えた場合に左に戻るよう再設定しています。

コメント

タイトルとURLをコピーしました