自己紹介
ただの情報系大学生です。Pythonでゲームを作るのが好きで、最初はTkinterを使って色々やってました。しかし、ゲームエンジンの存在を知ってからはなんて非効率なことをと嘆く日々です。
私と同じようにゲームを作りたいと思ったPythonistたちは絶対に同じ轍を踏まないでください。
Pythonでドット絵のゲームが作りたい!!!
Pythonでプログラミングをしていて、ゲームが作りたくなることはありませんか?ゲーム好きでプログラミングもするという方なら一度は思うことでしょう。しかし、知識もない3Dゲームは敷居が高い!ゲーム作りといえばUnityだけど、C#はわからん!
これ、きっとあるあるだと思います(そうじゃなかったらごめんなさい)。そうなると、選択肢は絞られてきますよね。気軽に進める道はやはりドット絵のゲームを作ることです。
使うべきGUIライブラリは?
さて、Pythonでドット絵のゲームを作るとなると、重要なのは何のライブラリを使ってGUIを作るかというところになります。一番簡素かつ有名なのはTkinterですが、あれははっきり言って機能が最低限な上可読性が低いです。まあ、簡単なツールをテストする名目とかが妥当な使い方ではないでしょうか。
ゲーム作りに使うGUIライブラリはきちんとゲーム作りに特化したもの、つまりゲームエンジンを使いましょう。インターネットでPythonのゲームエンジンを検索してみると、ほとんどが「Pygame」についてのドキュメントであると思います。
ユーザーの多いPygameとはどんなエンジンか
シェア率が高かったので、私が最初に触ったゲームエンジンはPygameでした。ところがどっこい、最初の画面を出す、多少の更新処理をやってみるまでは簡単ですが、あのライブラリでは画像処理が主になってしまいます。画像処理でドット絵のゲームを作るのは別に間違ったことではありませんし、Pygameの勉強にももちろんなります。ですが、あのライブラリではレイヤーや更新処理の最適化など考えることが多く、またサポートされているメソッドも非常に多様です。
そりゃあ便利で細かいところまで組めますよ、でもこれからゲームを作りたいと言う人にとって少々煩雑な部分が多いんです。第一、画像処理でドット絵を構成するって何だかドット絵以外にも対応している分、処理が重くなりそうな感じがしませんか?これは偏見かもしれませんが。
あ、ちなみにドットじゃない2DゲームはじゃんじゃんPygame使っちゃってください。私がドット絵にこだわっているだけというツッコミはなしで。
そこで登場する真打Pyxel
自作シューティングゲームの画像
ここで、私が推したいのはPyxelというモジュールです。このモジュールは基本的にドット絵しか描画しません。この時点でドット絵が目的の人にとって最高だと思うのです。
リソースファイル
まずPyxelはpyxresファイルという独自のリソースファイルを持ち、専用のエディタでそのファイルを編集することができます。これはドット絵のリソース、ドット絵を組み合わせたタイルマップ、音楽のリソース、音楽のリソースを合わせたbgmという四つの項目からなるものです。このファイルをコードから読み込むことによってリソースをファイル内の座標やidで呼び出すことができ、描画のコードがとても簡潔に書けます。もちろんコードから直接図形なんかを描くこともできますし、PyxelUniveralFontという別のモジュールと組み合わせるとテキストもドットで出してくれる優れもの。つまり、レトロなゲームにはうってつけなゲームエンジンであるわけです。
実行形式
Pyxelはpyxappという実行ファイル形式をサポートしていて、これはコマンドラインから実行できるほかにOS依存の普通の実行ファイルやhtml形式にも変換できるようになっています。共有性がすごく高いです。
また、更新処理も可読性がかなり高いフォーマットであると個人的に感じています。というのも、更新処理を開始する方法がrunメソッドの引数に更新関数と描画関数を渡すというもので、モジュール側からある程度のオブジェクト指向が形成されるような形に誘導されるのです(オブジェクト指向のなんたるかを理解しきれていない若輩者ですので、この点に関しては異論があるかもしれません)。
説明は以上。あとは実際に触ってみよう
ここまで色々と語りましたが、この日本語の塊でPyxelの良さを理解しろというのは無理があるとも思います。ですので、興味を覚えた方はぜひ、いますぐにでも、GithubにあるPyxelのREADMEを読んでいただきたいです。ここには私が今まで述べたPyxelの情報以上のことが全て載っています。かくいう私も、このREADMEの冒頭に載せられた画像・動画に魅せられたクチです。百聞は一見にしかず、下のリンクを踏んで見てみてください。
https://github.com/kitao/pyxel/blob/main/docs/README.ja.md