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

nogajun
nogajun

去年、いろいろあってプログラミングの授業を引き継ぎました。去年は授業の準備期間がほとんどなく、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でグローバル変数の扱いが違うのでクラスでラップしなきゃいけなくなったというのが真相かも、と思いました。

とはいえ、クラスを教えずに使うのも気持ち悪いので、やっぱりラップせずに使えると嬉しいなぁ。

参考