最近画像処理にかかりきりですが、画像はゲームの花形ですからね!仕方ないです。


いきなりですが、画像のパレット色を変更する関数を考えてみましょう。


public Image changePlteColor(byte[] temp,int plteid,int r,int g,int b){

  int index = new String(temp,0,temp.length).indexOf("PLTE")+4+ plteid*3;

  temp[index] = (byte)r;

  temp[index+1] = (byte)g;

  temp[index+2] = (byte)b;



  Image result = Image.createImage(temp, 0, temp.length);

  return result;

}


これを使えば、バイト列で表現された画像のパレット色を統一的に変更できます。渡されたバイト列のうち、「PLTE」チャンクを探してindexに修正位置を保存しています。この関数の場合、パレットNoは0から始まることに気をつけてください。



さて、実際に画像を扱う場合、マップなどの状態に依存した管理が求められることが多いと思います。

例としては、あるマップで使うマップチップや出現する敵の画像ですね。起動時に全て読み込んで保存しておくというのはメモリ効率が悪すぎます。



ここらを踏まえてスクリプトを書くとすると、



loadImageAsBytes nickname filename.png

createImage nickname01 local frombytes nickname

changePlteColor nickname 1 255 255 255

createImage nickname02 local frombytes nickname

release nickname

createImageChip nickname03 local from nickname02 4 4

defineEnemyImage 12 asChip nickname03 2

release local



といった感じになるでしょうか。

自分で適当に作ったスクリプトなので意味が分からないと思いますが、要は

・画像をバイト列として読み込む機能

・画像のパレット色を変更する機能

・画像からチップを切り出す機能

・切り出したチップを何かと関連付ける機能

・確保したメモリを、localなどのキーワードに応じて解放する機能

等が実装されていれば十分だと思います。なお、スクリプトの文字列から変数を指定することになるので、ハッシュを継承したクラス等が必要になりますね。