Python向けレトロゲームエンジンPyxel 1.5.0をリリースしました!

かなり久々のブログ更新。Pyxelの開発に時間を割いていたため、ブログもだいぶ間が空いてしまいました。

12月11日に新バージョンのPyxelである1.5.0をリリースしました。前回のリリースは昨年11月でしたので、実に13ヶ月ぶりのバージョンアップになります。

f:id:tkitao:20211218134657p:plain

その間、何か別のことをやっていたかというと、そういうわけではなく、今後Pyxelで色々やりたいことを実現できるように、Pyxelを新規に設計し直していました。つまり、新しいPyxelは以前のバージョンと中身が全くの別物になっています。

この大変更によりできるようになったことは非常にたくさんあるのですが、本日は1.5.0の変更内容を大きく3つのグループに分けて、それぞれの概要を紹介していきたいと思います。

Pyxel 1.5.0について

Pyxel 1.5.0は、対応プラットフォームの拡大(将来的なWeb対応も含む)、アプリ配布とプレイの簡易化、性能・品質・柔軟性の向上、メンテナンスコストの削減などを目的として、コアエンジンをC++からRustに切り替えて再設計した、Pyxelの最新メジャーバージョンになります。

本当はWeb対応まで終えてバージョン2.0としてリリースしたかったのですが、対応言語の選定にかなり難航して(実はNim版Pyxelも途中まで作りました)、想定以上に前回リリースから時間が経過してしまったため、Web対応は次に回して、1.5としてリリースすることにしました。

Pyxel 1.5.0の変更点は大きく3つにまとめることができます。

それぞれの概要を説明していきます。

なお、Pyxelの具体的なインストール方法やAPIの詳細などについては、Pyxel日本語版マニュアルを別途ご参照ください。

スタンドアロン版Pyxelのサポート

これまでのPyxelの悩みの一つにインストール方法がありました。

以前のバージョンも必要なライブラリが揃ってさえいれば、pip install -U pyxelでインストールは完了だったのですが、そもそもpipコマンドを使ったことがない、SDL2のなどのライブラリの追加方法がわからない、という方もそれなりに多く、Pyxelをきっかけにプログラミングの楽しさを知って欲しい作者としては歯がゆい思いをしていました。

別の問題としてPythonのバリエーションの存在があります。Pythonがさまざまな形で普及すること自体は喜ばしいのですが、使用者が気づかないままPython2、Python3、Anaconda版など複数のPythonが一つの環境に混在してしまっていることがあり、「Pyxelを(環境Aに)インストールしたのにPyxelが(環境Bで)見つからずエラーになる」といったことも起きていました。

そこで新Pyxelでは、パッケージ版とスタンドアロン版の2種類を提供することにしました。

パッケージ版は以前と同じくpipコマンドでPythonの拡張ライブラリとしてPyxelをインストールするバージョンで、一方スタンドアロン版はインストーラーでPythonに依存しない単独ツールとしてPyxelをインストールするバージョンになります。

スタンドアロン版は、Pythonがどのような形でインストールされていても確実に動作するのと共に、Pyxelアプリケーションを手軽に遊びたいという人が、わざわざPythonをインストールしなくても済むというメリットもあります。

なお、パッケージ版についても、コアエンジンをRustに移行したおかげで依存する外部ライブラリが大幅に削減されており、Windows版とMac版は事前にインストールが必要なライブラリは一切なくなっています。

Pyxelコマンドによる開発と配布

Pyxel 1.5.0ではpyxelコマンドでPyxelの開発に必要な一通りの作業を行えるようになりました。

例えばサンプルをインストールしたければ、

pyxel copy_examples

作ったPythonスクリプトを実行するには、

pyxel run スクリプトファイル

画像やサウンドなどのリソースを編集するのであれば、

pyxel edit リソースファイル

といった具合です。

また、pyxelコマンドにはこれ以外に新しい機能が2つあります。それは「Pyxelアプリケーションファイルの作成」と「Pyxelアプリケーションファイルの実行」です。

これまでのPyxelの課題に、ゲームやアプリケーションを作っても、それを手軽に遊んでもらう手段がないという点がありました。

Pyxelアプリケーションを遊んでもらうには、相手も同じ環境を用意して同じようにコマンドを実行するか、別途PyInstallerなどのツールを使って専用の実行用バイナリを作る必要がありました。環境構築はPythonに慣れていない人にはハードルが高いですし、実行用バイナリは作るのが手間である上に、動作する環境がWindowsのみ等、特定のプラットフォームに限定されてしまいます。

そこでPyxel 1.5.0では新たに「Pyxelアプリケーションファイル形式 (.pyxapp)」をサポートすることにしました。これは作成したスクリプトと必要なデータを1つのファイルにまとめて、pyxelコマンドでプラットフォームによらず実行できるようにするものです。ご存じの方には、JavaのJarファイルのような利用形態と捉えてもらうとわかりやすいと思います。

Pyxelアプリケーションファイルは、一つのディレクトリにスクリプトとデータを入れて、

pyxel package アプリケーションディレクトリ 実行スクリプトファイル

で作成し、作成したファイルは、

pyxel play Pyxelアプリケーションファイル

で実行することができます。

ちなみに、Window向けインストーラースタンドアロン版Pyxelをインストールすると、拡張子の関連付けも行われるので、Windowsユーザーであれば、.pyxappファイルをダブルクリックするだけでPyxelアプリケーションを実行することができます。

上級者APIの追加

Pyxelはレトロゲームエンジンを標榜しており、またプログラミング初心者の方も気軽に学習ができるよう、仕様に意図的な制約を設けたり、使える命令の数を少なくして、マニュアルの理解に必要な時間が短くなるよう、かなり慎重な調整を行っています。

しかし、PyxelユーザーにはPythonプログラミングに習熟しており、凝ったゲームを作りたいという「プログラミング上級者」の方々もいて、そういった方々からは折に触れ「この制約をなくしてほしい」「この部分を変更できるように命令を増やしてほしい」という要望をもらっていました。

私自身もかつてはゲームプログラマーでしたのでその気持ちは非常に良くわかるのですが、一方で膨大なマニュアルや、似てはいるが微妙に異なる命令群を目にして途方にくれる初心者の方が出てしまうの避けたいという気持ちが強くありました。

そこで、Pyxel 1.5.0では、通常の命令セットとは別に、上級者向けの命令セットを用意しました。

これにより、「Imageクラスのインスタンスを任意の数作成して、サイズ制限なしに大量の画像を使用する」「ImageクラスやTilemapクラスの描画メソッドでオフスクリーン描画を行う」「Channelクラスにアクセスして、チャネル全体の音量を変更する」「テキスト入力バッファにアクセスして、文字入力機能を実現する」などの処理が自由に行えるようになっています。

この説明で何ができるかピンと来た方は、こちらの命令定義一覧をヒントに上級者APIにチャレンジしてみてください。

最後に

おかげさまでPyxelはGitHubで9000スターに到達することができました。

f:id:tkitao:20211213163711j:plain

ここまで来ると、キリよく10000にしたい気がしてきましたので、GitHubユーザーの方はこちらから応援いただけるとうれしいです。

また、Pyxelに関する質問や意見交換などしたい場合は、作者Twitterまでご連絡をいただくか、日本語版Pyxel Discordサーバーをご利用いただければ幸いです。

特に、日本語版Discordサーバーは、Game Jamなどが開催されている英語版に比べると、そこまでポピュラーになっていない感があるので、1.5.0のリリースをきっかけに、日本のユーザーの方々の交流が盛んになってくれるといいなと思っております。

それでは、今後ともPyxelをよろしくお願いします!