見出し画像

ちゃんと表示される

いかんなあ、Everquestの日記を書こうと思ったが、pyxelが楽しくてすすまない。PCもいじらないといけないしなんか妙に忙しいな。

Pyxelで16色を超える表現が可能になったので、早速自作Wizardryに適用しようと思う。色数はいろいろ悩んだが、32色にした。32色出せるハードウエアはあるのかな、ゲームギアか。減色のアルゴリズムができたので、それを全画像に対して行って、そのデータファイルを固めてひとつにするツールをまずは作る。

減色処理のK-means法はそこそこCPUパワーを食うので、画像ごとに他のプロセスを割り当てて処理させるようにした。ちょっと前に深層機械学習を勉強する機会があったが、それぞれの処理がかなり重く、いかに並列化させるかというのがわかった。Pythonは並列実行が結構簡単にできるので便利だ。

実行中の様子

それぞれのプロセッサに画像ファイルひとつの減色処理をやらせている。上のログをみてもらうと分かる通り、絵によって処理の重さがかわるため、最初はきれいに並んでいるがそのうち順番がめちゃくちゃになって見ていて楽しい。

自分の作ったプログラムでCPUをこれだけ使うと感動する

全画像を処理するのにだいたい2-3分くらいだと思う。これでも深層強化学習でスーパーマリオの8-1の学習は1-2日くらいかかったので全然早い。

zipでくれ

変換したテキストファイルは最初プログラムに埋め込もうと思った。しかしそれだと起動にめちゃくちゃ時間がかかるし使わない可能性のあるデータの分メモリを専有するのはどうかなと思ったが、かといってテキストを外部ファイルとしておいておくのもかなりかさばる(テキストで30MBくらいある)し、イメージごとにわかれているとは言え、かさばるファイルをそのまま読むのでは時間がかかるため、まずはzipでまとめた(2.5MBくらいに圧縮)。使うときもpythonのzipfileの機能をつかってzipから特定のファイルを直接指定して読むようにした。テキストファイルの読み込みもjson形式だと重いため、出力されたリストをevalで直接読むようにした。
これでimageディレクトリ下に大量のpyxresを置いて読むという全くスマートでないやりかたから脱却できた。ここまで自分でつくっておいて何だが、実はこれやり方としてはPyxelのpyxresと全く同じなんだよね。pyxresファイルも実はzipファイルで、解凍すると中にスプライトや音、タイルなどのテキストファイルが置いてある。形式もリストがべろっと書かれているので、全くもってやり方は同じだ。

さて、データの読み書き部分ができたので、早速表示してみよう。今までpyxel.load()とpyxel.blt()で読み込んだり、画面にだしていたが、同じ書式で中身は別物のload()とblt()を作り、現在のコードを大幅に変更しなくとも実行できるようにした。

グラデーションがきちんと表示されている
特徴のある色も別れて表示
微妙に同じような色でもきちんと表現
金属の質感もきちんと表現

もうこのくらいにしておこう。まず色数32色まで拡張して予約色が増えたので、wizardryのロゴがモンスターのパレットに影響をうけなくなり、きれいに表示された。肝心のモンスターも、今まで11色だったものが24色まで増え、さらにpillowよりも出来がよい(と思っている)謹製の減色プログラムによりオリジナルと寸分違わず、かつ色数がそれなりに落ちてレトロ感のある雰囲気な絵になっている。自分でいうのもなんだが、かなりいい感じになったのではないだろうか。

今日の最後に、今回の修正の途中でバグったときのスクリーンショット。タイルのオフセットを間違えたため、迷宮の壁をフォントで表示されるようになってしまった。これでもそれなりに見えるのが面白い。女神転生のビエンの街みたいじゃない?


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