⛩️

Pyxelで「あけおめ」してみる

2025/01/01に公開

あけましておめでとうございます。

ここ数年、年賀状を出すこともなくなり、SNSで流れてくるあけおめ投稿にいいねするくらいしかしていないながらも、年末が近づくと、なにかしようかな?とかメガデモっぽいものをつくって配布しようかな‥とか考えながらも、なんやかんやで忙しくてなにもせずに新年を迎えるというのが続いていました。

Pyxelで「あけおめ」してみる

2024年の後半は、プライベートでPythonによるデータ分析的なチュートリアルをやってみたり、サプーさんの動画をみながら一緒にやってみたり‥ってな感じのことをしていましたので、Pythonで「あけおめ」してみるか‥と思いつきまして、でもコンソールに「Hello World」の代わりに「あけましておめでとうございます」とか表示される「だけ」なのもなんか面白味ないので、Pyxelを使ってなにか画面でバーンって表示できるような成果物ができるまでやってみようかな‥ってことにしました。

Pyxelの概要

PyxelはPythonでコードを書くことができる、ゲームをつくるやつ(ゲームエンジン?)です。

https://github.com/kitao/pyxel/

種類としては、ファンタジーコンソールというもので、PICO-8やTIC-80が有名で、初代ファミコンやセガといった家庭用ゲーム機でプレイしていたようなレトロなゲームの制作環境・仮想的なゲーム機のエミュレータ?というものらしいです。

あと、ドット絵やサウンドなどを作る機能が付属で搭載されていて、画像編集ソフトや音楽制作ソフトなどがなくてもゲームやBGM/SEが作れます。

個人的な印象ではウゴウゴルーガとかで使ってた、Amigaとかの環境みたいだなって思いました。

マルチプラットフォーム(Windows/MacOS/Linux)に対応していて、日本語のドキュメントや情報が充実しているという特徴があります。

Pythonのコードを実行すると、ウインドウが表示されて、その中でキャラクターなどをマウスやキーボートで操作したり、音がなったりするコンテンツを簡単に作成できます。

ウインドウが表示される‥ということで、TkEasyGUI も候補で考えましたが、GUI以外にも画像や音を「制作」する環境も一緒に用意されているPyxelで行こう!ということに脳内会議で決定しました。

https://note.com/kujirahand/n/n33a2df3aa3e5

環境設定

私の環境としては、MacOS上でVS Codeでコード書きつつターミナル操作もVS Codeで完結する感じです。
手順としては、OSのターミナルで作業ディレクトリを作って、そこからcode .でVS Codeを開いて作業開始という感じでやってます。

Pythonの確認

まずはPyxelでものを作る環境を整備します。私はMac M2(MacOS 15.1.1)で作業しています。Pythonが最初から入っているのですが、仕事でもちょくちょく使うので、複数バーションをasdfで管理していたりします(Rubyもnodejsも同時に管理できて便利)。なのでデフォルトの状態はもう忘れてしまっていますので、Pythonが動く環境まで手元の機材を整備してください。

上記のような事情ですので、以下の内容をWindowsでやる場合は、環境設定がすこし面倒かもしれませんが、各自で対応してください。すいません。
自分はWindowsユーザーだからいいや‥って記事を読むのをやめようと思った方も、ひとまず、記事の最後の方の完成品だけでも見ていってくれればうれしいです。

では、Pythonの有無とバージョンを確認します。ターミナルで下記のコマンドを実行してください。

python -V

「Python 3.12.4」とか表示されればOKです。Pyxelはversion 3.8以上が必要なので、それ以上であれば問題ありません。

uvの確認

最近はなにかと便利なuvでプロジェクト管理しています。
uvはRustで書かれたPython用パッケージ管理ツールです。

https://docs.astral.sh/uv/

色々便利で、以下のことができます。

  • Pythonバージョンをインストールして管理
  • venvによる仮想環境の構築
  • ライブラリの依存関係の管理

と、公式やいろいろな紹介記事に書いてあるけども、実際に使用した実感でいうと、

  • コマンドを覚えるといろいろ楽
    • 仮想環境に入らなくてもコードを仮想環境上で実行できる
    • なので、入ったり出たりの際のコマンド入力が省略できる
    • 複数の仮想環境の切り替えが楽(まだやったことないけど)
  • Ruffとの親和性
  • 高速で安定したツールがどんどん追加されてる
  • タブでファイル名の入力補完ができないのはちょっと面倒
  • Pythonとuvがインストールされていれば、condaとかなくてもなんとかなってシンプル
  • プロジェクト開始時の細かいルーチンが省略できる
    • ディレクトリ作成
    • 仮想環境の構築
    • カレントディレクトリの移動等

といった感じ。

uvのインストール

  1. curl -LsSf https://astral.sh/uv/install.sh | shもしくはbrew install uv
  2. uv --versionでいちおう確認
  3. アップデートする場合は、uv self update

Pyxelのインストール

プロジェクトを作成したい場所で下記のコマンドを実行して、新規プロジェクトを作成します。

uv init akeome2025

新規プロジェクトのディレクトリが作成されるので移動します。

cd akeome2025

initで生成された、hello worldのコードを実行してみます。

uv run hello.py

ちなみにこんなことも可能です、

uvx pycowsay 'hello world!'
  ------------
< hello world! >
  ------------
   \   ^__^
    \  (oo)\_______
       (__)\       )\/\
           ||----w |
           ||     ||

Pyxelをインストールします。

uv add pyxel

ついでなので、Ruff(コード解析&整形ツール:uvと開発元が一緒)も入れておきます。

uv add ruff

現在導入されているライブラリを確認します。

uv pip list
Package Version
------- -------
pyxel   2.2.7
ruff    0.8.2

サンプルを見てみる

Pyxelのインストールができたので、コードを書く前にサンプルを見てみましょう。
サンプルは下記コマンドでインストールします。

uv run pyxel copy_examples

uv runでサンプルを実行してみます。

uv run pyxel run pyxel_examples/01_hello_pyxel.py

サンプルを実行

20個ほどのサンプルがあるので、一通り目を通して参考にすると良いです。

uv run pyxel run pyxel_examples/07_snake.py

とか、縁起ものとして起動してプレイしてみるのもいいかも。
実行ファイル形式(.pyxapp)のものは、pyxel runではなく、pyxel playで起動します。

uv run pyxel play pyxel_examples/megaball.pyxapp

uv サブコマンド pyxel pyxelのサブコマンド パスみたいな感じで面倒では?(タブで補完できないし)とも思うときもありますが、いつか感謝する日がくるはずです。

作ってみる

環境が整ったので、あけおめコンテンツを作成していきます。
作るのは、マウスでスプライト(キャラ)を動かして、特定のエリアに重なったら、「A HAPPY NEW YEAR!」と表示するコンテンツです。
キャラは干支のヘビにしようかな‥と思いましたが、なんか描きづらいのでネコにします(Pythonのアイコンがヘビなのでそれを使うのも考えましたが、ドット絵に変換するのが面倒くさそうなので却下)。

スプライト(キャラ)を作る

エディタを起動して、スプライトを16x16の大きさで作成します。

uv run pyxel edit

エディタを起動

エディタでは、画像の作成の他に音関係の作成・編集も可能です。上部左側のアイコンで切り替えて作業します。スプライトが完成したら、上部中央のアイコンで保存します。保存すると、my_resource.pyxresというファイルが作成されます(保存するまえに閉じると、悲しいことになります)。

本やWeb上の記事では、pyxeleditorで起動みたいに書いてあることがありますが、パスの設定によっては起動しないみたいなので、uvで環境構築したなら、上記コマンドで大丈夫です。

Pyxel Editor使用方法の詳細は下記の記事を読むと良いです。

https://note.com/koide_mizu1433/n/n289cf5c5c785

コードを書く

akeome.pyというファイルを作成し、コードを入力します。

touch akeome.py
akeome.py
# ライブラリの読込
import pyxel

# ステージサイズの設定
pyxel.init(128, 64)
# リソースの読込
pyxel.load("my_resource.pyxres")

# 使用する変数の初期化
x = 0
y = 0
status = 0

# 更新処理(1秒に60回実行)
def update():
    # 値を更新するので、グローバルとして変数を読込?
    # 指定?宣言?スコープを明示?
    # 言い方はわかりませんが、必要
    global x,y,status
    # マウスの座標で更新
    x = pyxel.mouse_x 
    y = pyxel.mouse_y
    #マウスの位置でステータスの変更
    if x == 5 and y == 5: 
        status = 1
    else:
        status = 0
    # 処理終了
    return

# 描画処理
def draw():
    # 画面を1番の色で塗りつぶす
    pyxel.cls(1)
    # 1番のスプライト(枠の画像)を配置
    pyxel.blt(5, 5, 1, 0, 0, 16, 16) 
    # 文字を配置
    pyxel.text(11, 22, "^", 7)
    pyxel.text(11, 24, "|", 7)
    pyxel.text(6, 32, "LET'S MOVE CAT HERE!", 7)
    pyxel.text(84, 55, "2025.01.01", 8)
    # 0番のスプライト(猫の画像)を配置
    pyxel.blt(x, y, 0, 0, 0, 16, 16)
    # 条件によっては文字を配置
    if status == 1:
        pyxel.text(30, 12, "A HAPPY NEW YEAR!", 9)
    # 処理終了
    return

# Pyxelの起動
pyxel.run(update,draw) 

コードを書いたら、下記コマンドを実行します。

uv run akeome.py

ウインドウが表示

ウインドウが表示されましたでしょうか?マウスを動かして動作を確認してください。
あとは、マウスの適用される範囲を指定したり、BGMやSEをつけたり、スタンドアロン形式やWeb形式に書き出したりして完成です。

完成品披露

というわけで、完成品を御覧ください。
BGMとかキーボード操作とか自動プレイ機能とかエンド画面とか追加してます。

https://neuvecom.github.io/akeome2025/

ソースはこちら
https://github.com/neuvecom/akeome2025

あとがき

昨今はAIの進化が目覚ましく、そっちの方も気になったりしてます。
本業ではRubyやGASがメインでPythonは趣味で触っている程度ですが、Pythonは気楽にコード書けて癒やされます(段下げ、囲みが少ないなど)。
本業ではプロジェクト管理の面と歴史的な事情から、Pythonを本格的に使うのを保留してましたが、最近みつけたuvがいい感じなので、プライベートで使い倒して、体に染み付いてきたらなんか簡単なツールでも作って徐々に取り入れて行ければいいなぁと思ってたりします。

まあ、体調面で波があり、年内のどこかでポックリ逝きそうな感じもなくはないのですが、いろいろ楽しみなこともありますし、適当にやっていければと思います。

補足

そういえば、今月、公式監修の本がでるみたいです。個人的にWebのドキュメントは目的なく読み込むのは辛い(量に圧倒されたり、内容が難しかったり)ので、まだ内容はわかりませんが、読み物として供給されるのは助かります。既存のpythonでゲームつくろう系の本はpygameがメインなのでちょっと困ってました。まあ、そういう本でもゲームの組み方とかの参考になるので、気が向いたら購入して読んでますが。

https://www.amazon.co.jp/dp/B0CW9QN4GT/

技術評論社から刊行なので、公式の電子書籍ストアでPDF版を購入する予定です。

https://gihyo.jp/book/2025/978-4-297-14657-3

理由はKindleだと複数の本を開けないのと、万が一Amazonが倒産や閉鎖、Kindleサービスの終了などした場合に読めなくなるからです。ふと思ったのですが、出版社が倒産した場合のKindleで買った本ってどうなるんだろう‥。

Discussion