3

PythonとPygameでゲームを書いています。このため、グラフィックはNESのような古いビデオゲームコンソールのスタイルになります。したがって、グラフィックは2ビット(4色)の画像を含む単一のタイルセットファイルで構成されており、これらの画像をロードするときに、任意の4色パレットを割り当てることができるようにしたいと思います。

私がやりたいのは、8ビット(256色)パレットモードを使用することです。パレットは、それぞれ4色の64個のサブパレットに分割されています。2ビットグラフィックファイルから16x16タイルをロードするたびに、これらの仮想4色パレットの1つをそれに割り当てたいと思います。したがって、生のタイルセットファイルでは、2ビットのインデックスファイルであるため、パレットインデックスは0〜3になります。このファイルからメモリにタイルをロードし、関数を使用してパレットインデックスを0〜3から選択したパレットオフセットに再割り当てします。これにより、画面にブリットしたときに、選択した4色で色付けされます。パレット-NESハードウェアが機能するのとよく似ています。これは説明するのが少し面倒になるので、おそらくこの写真はそれを少し明確にします:

ここに画像の説明を入力してください

PygameとPILのマニュアルを調べたところ、このようなパレットファイルを操作できるものは何も見つかりませんでした。調べるべき他のライブラリはありますか、または私が見ていないより簡単な解決策はありますか?

4

2 に答える 2

0

でこれを行うことができますpygame.Surface.set_palette_at()。あなたの場合、64 個のブロックに対して 4 つの色があるため、特定のブロックの色を変更するには、次を使用できます。

for n, newRGBA in enumerate(fourNewColours):  # where fourNewColours are the RGBA tuples you want to plop into the palette.
    GameSurface.set_palette_at(palette_offset + n, newRGBA)  # where palette_offset is the number of the first palette index you want to replace (adding n to increment your way through the new colours).

これは、4 色の個々のブロックを置き換える方法です。最初にすべてのパレットをゲーム サーフェスにプッシュするのは、より複雑になる可能性があります宛先サーフェスのインデックスを直接置き換える代わりに、ブリットされた画像のパレット。インデックス RGBA 値が重複しているピクセルの色を変更する方法がわからないため、さらに複雑になります。(たとえば、Palette 14/2 と Palette 40/1 が両方とも (90,91,200,255) の場合、pygame がその RGBA 値を持つすべてのピクセルをパレット インデックス 57 (Pal14/2 から) に割り当て、 Pal40/1 の idx 160 に none, または 2 つが別個のままである場合. その場で画像の色を変更したい場合、これは問題になる可能性があります. 少し長いルートを取り、ゲームパレットを次のように変更すると、確実に動作するはずです.必要に応じて、後で関連する新しいパレットでサーフェスをブリット (または再ブリット) します。

それが役に立つことを願っています(2年半以上経っていますが)!

この回答の長いバージョンを見たい場合は、このリンクをチェックしてください。

于 2014-12-14T06:38:54.920 に答える