
PythonのゲームライブラリPyxelでクラスを使わずに画面を描画する方法

去年、いろいろあってプログラミングの授業を引き継ぎました。去年は授業の準備期間がほとんどなく、Google Colaboratoryを使って授業をしたところ動くという実感がなく、反応があまり良くありませんでした。
今年は、その反省もふまえ、ThonnyというPython専用の統合開発環境とPyxelというゲームライブラリを使って全面的に変更することにしました。
やはり、絵が出ると反応は良いのですが、Pyxelには1つ欠点があります。それは実行するときにクラスを使うこと。
教えているのは文系の学生で、プログラミングはおろかキーボード操作もおぼつかない学生もいます。そんな学生にプログラミングを教えるのは、1からではなく0から、場合によってはマイナスからのスタートです。そのような状況なので、クラスの概念までは、とうてい、たどり着けないのでクラスは使えません。
そういうこともあって別のライブラリを使うことも考えましたが、レトロゲームの限定された環境の魅力もあるので、Pyxelでクラスを使わずに画面を描く方法を調べました。それをひとまずまとめておきます。
pyxel.show()を使う
一番簡単な方法。絵を書くだけならこれを使う。
import pyxel
pyxel.init(159,143)
pyxel.cls(pyxel.COLOR_NAVY)
pyxel.circ(160//2, 144//2, 4, pyxel.COLOR_WHITE)
pyxel.show()
pyxel.flip()を使う
これは、pygameでおなじみのwhileループの中でpyxel.flip()
を使って描く方法。欠点は描画速度を一定にできない。
import pyxel
pyxel.init(159,143)
while True:
pyxel.cls(pyxel.COLOR_NAVY)
pyxel.circ(160//2, 144//2,4,pyxel.COLOR_WHITE)
pyxel.flip()
pyxel.run()を使う
クラスでラップしなくても使えます。ゲームに使うならこれが一番実用的。
import pyxel
pyxel.init(159,143)
def update():
pass
def draw():
pyxel.cls(pyxel.COLOR_NAVY)
pyxel.circ(160//2, 144//2, 4, pyxel.COLOR_WHITE)
pyxel.run(update, draw)
Pyxelに思うところというか要望
Pyxelは、めちゃくちゃありがたいです。でも、「使うときはクラスでラップしろ」ではなくて、FlaskみたいにPyxelクラスになってると関数あたりまでで対処できるので、もし、Pyxel2ができるなら設計を考えてもらえると嬉しいです。
ていうか、クラスでラップしなくてもpyxel.run()
で大丈夫そうなんですがどうなんですかね?
まあ「Issueに書け」って話なんですが。そこまでやる気力がないから、とりあえず書くだけ書いておくということで…
(2024/6/22追記)
あれから調べながらプログラムを書いていましたが、Pyxelは設計思想的にPICO-8の影響が強いようで(PICO-8の日本語マニュアルを作ってるぐらいなので)、それ風に書けるようにしているけれどLuaとPythonでグローバル変数の扱いが違うのでクラスでラップしなきゃいけなくなったというのが真相かも、と思いました。
とはいえ、クラスを教えずに使うのも気持ち悪いので、やっぱりラップせずに使えると嬉しいなぁ。
参考
- Pythonでお絵描きしてみよう (Pyxelの新命令の紹介) - kitao's blog: https://tkitao.hatenablog.com/entry/2019/09/03/010514
- Pyxel 1.2.0 の紹介 #Python - Qiita: https://qiita.com/odanny/items/5e8322a3eeb9152c58cd
- FIT2-2022b 第04回 簡単なゲーム - fit-sakitsu: https://scrapbox.io/fit-sakitsu/FIT2-2022b_%E7%AC%AC04%E5%9B%9E_%E7%B0%A1%E5%8D%98%E3%81%AA%E3%82%B2%E3%83%BC%E3%83%A0