Pyxel 表示する色の数を増やす

カラーパレットの拡張

Python向けレトロゲームエンジン「Pyxel(ピクセル)」で表示色数を増やす実験をしました。
Pyxel 2.0.7 で追加された from_image()メソッド,load()メソッドを使用したもので,実験は 2.0.10 版で行いました。

※本記事の内容は公式にアナウンスされている仕様ではありません。ブラウン管表示やTMXファイル対応で表示機能が拡張されたPyxel 2版ではこんなこともできました,という紹介です。正式な用途はサンプル15「タイルマップファイル (.tmx) の読み込みと描画」(15_tiled_map_file.py)を参照してください。

パレットファイルで使える色を増やす方法

 参考記事
 Pyxel 1.9版の新機能 パレットファイルを指定する - 勉強ボックス管理者ブログ

 pyxel.load()でのリソースファイル指定時に,同名のパレットファイル (.pyxpal) があるとパレットが更新されます。あらかじめパレットファイルに17色目以降の色も定義しておくことで,プログラムから追加したパレットを使用できます。

パレットファイルの例(赤字箇所が追加した3色)

000000
2b335f
7e2072
19959c
8b4852
395c98
a9c1ff
eeeeee
d4186c
d38441
e9c35b
70c6a9
7696de
a3a3a3
ff9798
edc7b0
ff0000
00ff00
0000ff

ソースコード

import pyxel
pyxel.init(256,256)
pyxel.load("mygame.pyxres")

for i in range(16):
    pyxel.rect(8*i,0,8,40,i)

pyxel.text(8,48,"No.16",16)
pyxel.text(8,68,"No.17",17)
pyxel.text(8,88,"No.18",18)

pyxel.colors[18] = 0xFFFF00
# pyxel.colors[19] = 0x00FFFF  未拡張なのでエラーになる
           
pyxel.show()

実行結果

 パレットファイルで赤緑青の3色を追加して表示しました。ソース内で色番号18の青を黄色に更新しているので,一番下のテキストが黄色になっています。
 基本色以外に,文字色や図形でのエフェクトなどで別の色を使いたいケースで利用できるかと思います。

カラーパレットの画像出力ショートカット

 Pyxel 2.0.7 で追加されたPyxelアプリのショートカット「Shift+Alt(Option)+0」を使うと,現在のカラーパレットをデスクトップに保存できます。
 基本色のカラーパレット
 
 3色追加したカラーパレット
 

 

画像ファイルの色でパレットを拡張する

 Imageクラスの from_image()メソッドの色を含む指定の引数に True を指定すると,画像に使われている色でカラーパレットが作成されます。
 (Imageクラスの load()メソッドでも,オプションの引数にTrueを指定するとカラーパレットが更新されます)

 ※フルカラーの画像ファイルを読み込ませて使うとエラーになります。
  pyo3_runtime.PanicException: index out of bounds: the len is 255 but the index is 255
  pyxel-main\rust\pyxel-engine\src\settings.rs
  // Graphics
  pub const NUM_COLORS: u32 = 16;
  pub const MAX_COLORS: u32 = 255;


 255色に近い画像ファイルとして,下記サイトの Material 254 Colors の画面をキャプチャしたファイルを用意しました。
 Material Design Color, Flat Colors, Icons, Color Palette | Material UI
 読み込ませたファイル
 

ソースコード

import pyxel
pyxel.init(256,256)
pyxel.images[0] = pyxel.Image.from_image( "col.png", incl_colors=True )
for i in range(255):
    pyxel.line(i,0,i,256,i)
pyxel.show()

実行結果

※色番号0-15の基本色も画像ファイルの色で更新されます。
※イメージ1に画像を読み込んでも,カラーパレットは共通で更新されます。

import pyxel
pyxel.init(572,352,capture_scale=1)
pyxel.images[1] = pyxel.Image.from_image( "col.png", incl_colors=True )
pyxel.blt(0,0, 1, 0,0, 572,352)
for i in range(255):
    pyxel.line(i,0,i,256,i)
pyxel.show()

実行結果

 

タイルマップエディタも同時に使う

 Pyxelのリソースエディタでタイルマップを作成しつつ,キャラクターの色数を増やすやり方の案です。

 Pyxelアプリのショートカットで出力した基本色のカラーパレットを画像の先頭に張り付けて,ドット絵のエディタで他の色を追加したキャラクター用の画像ファイルを作成しました。

 別のWindowsアプリで作成したキャラクター用のファイル
 
 Pyxelのエディタでイメージバンク0にタイルマップ用の画像を作成
 
 イメージバンク0の画像を使ってタイルマップ0を作成
 

ソースコード

pyxel.init(256,256)
pyxel.load("mygame.pyxres")

# 別のWindowsアプリで作成したファイルを色も含めて読み込む
pyxel.image(2).load(0,0,"EDGE1.png", incl_colors=True )

# タイルマップを表示
pyxel.bltm(0,0, 0, 0,0, pyxel.width,pyxel.height, 0)

# キャラクターを表示
pyxel.blt(32,32, 2, 16,16, 48,48,0)
pyxel.blt(70,50, 2, 64,16, 48,48,0)

pyxel.blt(0,128,  0, 0,0, 256,8) # イメージバンク0の一部を表示
pyxel.blt(0,136,  2, 0,0, 256,8) # イメージバンク2の一部を表示

pyxel.show()

実行結果

カラーパレット

 タイルマップ用の基本色がそのままになるようにして,色を増やしたい場合は参考にしてみてください。

 

関連記事

kinutani.hateblo.jp