nicotakuya.hatenablog.com
前回の続きです。「HuC」を使って、PCエンジンのプログラミングをやってみたいと思います。
前回は変換ツールがPCXファイルしか対応してない&使いにくいというところで終わっていましたが、ついに変換ツールを自作してみました。
こちらで公開中です。
↓
sites.google.com
このツールを使うと、BMPファイルから画像/パレットデータを抽出することができます。
ツールの実行画面です。
ここでは例として、16x16ピクセルx64個のキャラクター画像を描いてみました。キャラクター1個あたりのデータ量は64ワードなので、64個で4096ワードのVRAMを消費します。
変換時のメニューです。
binary 16colorのボタンがPCエンジン用です。
変換後、「pattern.bin」(パターン)と「palette.bin」(パレット)という2つのバイナリファイルが出力されます。
最初は「const char pattern[]={ データ、、、」みたく、テキストで出力したかったのですが、インクルードするとhucで謎のエラーが出てしまうので、バイナリにしました。
動作確認用のプログラムを作ってみました。以下の通りです。
/* sprite move by takuya matsubara*/ #include "huc.h" #incbin(pattern,"pattern.bin"); #incbin(palette,"palette.bin"); #define CHRADDR 0x6F00 #define SPMAX 64 main() { int num; char newx,newy; char x[SPMAX],y[SPMAX],x1[SPMAX],y1[SPMAX]; load_vram(CHRADDR,pattern,64*64); init_satb(); for(num=0; num<SPMAX; num++){ spr_set(num); spr_pattern(CHRADDR+(64*num)); spr_ctrl(SIZE_MAS|FLIP_MAS, SZ_16x16|NO_FLIP); spr_pal(0); spr_pri(1); x[num]=16+(num % 14)*16; y[num]=16+(num / 14)*16; x1[num]=(num % 7); y1[num]=(num % 5); if((x1[num]==0)&&(y1[num]==0))y1[num]=1; } vsync(1); set_sprpal(0, palette); while(1){ vsync(1); for(num=0; num<SPMAX; num++){ spr_set(num); newx = x[num]+x1[num]; newy = y[num]+y1[num]; if((newx<=8)||(newx>=248)) x1[num] *= -1; if((newy<=8)||(newy>=232)) y1[num] *= -1; spr_x(newx); spr_y(newy); x[num]=newx; y[num]=newy; } satb_update(); } }
パターン/パレットデータは「#incbin」マクロで組み込みます。
load_vram関数でVRAMに転送します。パターンの転送先は適切なアドレスがよくわかりませんが、0x6F00番地にしてみました。0x7EFF番地までデータが格納されます。
これで、「#incspr」や「#incpal」を使わず、PCXファイルが不要になりました。
このソースをビルドして、ROMイメージ(pceファイル)を生成します。
PCエンジンのエミュレータで実行した結果がこちらです。
64個のスプライトが画面をバウンドします。
エミュのせいかもしれませんが、全然処理落ちしてません。実機だとどうなるのか気になります。