見出し画像

[Pyxel]Pythonでマトリックスの世界を再現

最近、Pyxelというゲームエンジンを触っていますが、レトロな色調がとても気に入っています。私はファミコン(初代)世代なので、自分でレトロゲームを簡単に作れるのがとても楽しいです。

Pyxelのアップデートにより、日本語フォントの表示が簡単にできるようになったので、早速試してみました。「映画マトリックス」で緑の文字が空から落ちてくる印象的なシーンがありますが、これをPyxelで再現してみましょう。

こいでみず様が「pythonでマトリックスっぽいやつ」で既に「映画マトリックス」の世界を実装されています。これは私が初めて動かしたPyxelコードで、キラキラ光る文字がとても素敵なプログラムです。

ただし、これは数字のみに対応しているので、今回は一部改造して日本語(カタカナと記号)に対応させます

Pyxelでマトリックスを実装する

# -*- coding: utf-8 -*-
# mtr.py

import pyxel
import numpy as np
from random import randint


class APP:
    # アルファベットのリスト(小文字と大文字)
    # alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    alphabet = ("アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンガギグゲゴザジズゼゾダヂヅデド"
                "バビブベボパピプペポ::。。・・//¥¥ーー             ")

    def __init__(self):
        self.w = 196
        self.x = 0
        self.y = -self.w
        self.send_string_num = 8
        self.length_string = 20
        # ランダムなインデックスの配列を生成
        random_indices = np.random.randint(0, len(self.alphabet), (self.send_string_num, self.length_string))
        self.pos_x = np.random.randint(0, self.w, (self.send_string_num, 1))
        self.pos_y = np.random.randint(0, 40, (self.send_string_num, 1))
        # インデックスをアルファベットにマッピングして文字列を生成
        self.random_strings = [[self.alphabet[idx] for idx in row] for row in random_indices]
        # ビットマップフォントの読み込み
        self.font = pyxel.Font("assets/misaki_mincho.bdf")
        self.font_size = 8
        # self.font = pyxel.Font("assets/umplus_j10r.bdf")
        # self.font_size = 10
        # self.font = pyxel.Font("assets/umplus_j12r.bdf")
        # self.font_size = 12

        pyxel.init(self.w, self.w, title="mtr", display_scale=6, fps=30)
        pyxel.mouse(False)
        pyxel.run(self.update, self.draw)

    def update(self):
        pass

    def draw(self):
        pyxel.cls(0)

        for i in range(int(self.send_string_num)):  # 複数箇所に文字列を配置する
            for ii in range(self.length_string):  # 縦方向に文字を繋げる
                c1 = randint(1, 20)
                if c1 == 1:
                    c = 11
                else:
                    c = 3

                x = self.x + self.pos_x[i][0]
                y = self.y + self.pos_y[i][0] + self.font_size * ii
                # フォントを指定してテキスト表示
                pyxel.text(x, y, str(self.random_strings[i][ii]), c, self.font)

        self.y += 1
        if self.y > self.w:
            self.y = -self.w
            self.pos_x = np.random.randint(0, self.w, (20, 1))


APP()

pyxel_matrix.pyという名前のファイルを作成し、上記のコードを貼り付けてください。コードの改造箇所について以下に説明します。

  • alphabet変数には、表示させたい文字(カタカナと記号)を代入します。

  • send_string_num変数は、表示する文字列の数を指定します。

  • length_string変数は、文字列の長さを指定します。

  • self.font = pyxel.Font("assets/misaki_mincho.bdf")のコードで、ビットマップフォント(美咲フォント)を読み込み、font変数に代入します。ビットマップフォントは、ドットで表現されたフォントで、レトロゲームや低解像度ディスプレイでの使用に適しています。

  • pyxel.textメソッドの5番目の引数にself.fontを指定することで、日本語の表示が可能になります。

Pyxelスクリプトを実行する

上記のスクリプトを実行するために、ビットマップフォントを用意します。

図1 X11 BDF形式をダウンロード

8×8ドット日本語フォント「美咲フォント」の上記リンクから「X11 BDF形式」をダウンロードします。ダウンロードしたZIPファイルを解凍し、フォルダー内の「misaki_mincho.bdf」をコピーします。

pyxel_projects
  │  ├ asstets
  │  │  ├ misaki_mincho.bdf
  │
  │  ├ pyxel_matrix.py

このディレクトリ構造を参考に、misaki_mincho.bdfをプロジェクト内のassetsフォルダーに保存します。これにより、pyxel_matrix.pyからフォントを読み込めるようになります。

次に、pyxelパッケージをインストールします。既にインストール済みの方はアップデートを実行します。pyxelのバージョン2.2.1以降がインストールされたことを確認して下さい。

pip install pyxel
pip install --upgrade pyxel

# インストールされたバージョン(2024.9.1実行)
Successfully installed pyxel-2.2.1


pyxelパッケージのインストールが終わったら、次のコマンドを実行します。

python pyxel_matrix.py
図2 マトリックス(カタカナバージョン)

このコマンドを実行すると、マトリックスの世界が再現されます。全角スペースや全角記号を含めることで、映画「マトリックス」の雰囲気をより忠実に再現することができました。

Pyxelで簡単に日本語表示ができるようになったことで、ゲームのローカライズが一層容易になりました。Pyxel開発者のkaito様、そして改造前のプログラム作成者であるこいでみず様にも、心より感謝申し上げます。


この記事が気に入ったらサポートをしてみませんか?