○ワンダーウィッチ[スピ魅を移植してみよう(その6)]

・自分の場所を分かりやすくしよう

中心が自分のいる場所だと分かっていても,非常に分かり辛い。
そこで,自分の位置を分かりやすくする為に,スプライトを表示してみよう。

/*現在位置用枠*/
unsigned short bmp_center[]={
0x0F00, 0x300F, 0x4030, 0x4020, 0x8040, 0x8040, 0x8040, 0x8040,
0xE000, 0x18E0, 0x041A, 0x0402, 0x0201, 0x0201, 0x0201, 0x0201,
0x8040, 0x8040, 0x8040, 0x4020, 0x4020, 0x3000, 0x0F30, 0x000F,
0x0201, 0x0201, 0x0201, 0x0402, 0x0402, 0x1804, 0xE018, 0x00E0
};

void rCenterPoint(void){
/*中心位置スプライト表示*/
font_set_colordata(102, 2*2, bmp_center);
sprite_set_range(102, 4);
sprite_set_location(102, 8, 6);
sprite_set_location(103, 9, 6);
sprite_set_location(104, 8, 7);
sprite_set_location(105, 8, 7);
}

1つ1つ位置を指定する方法しか分からなかった(^^;
まぁ,4つだけで,動かさないので,これで良しとする。

実行してみると,何も表示されなかった(;_;)
文字フォントの時のように,範囲を指定するとそこにキャラクタが敷き詰められて,そのキャラクタを描き変える事で表示が可能となる
と言う考え方が通用しないのか?

・原因を追求する

まずは,初めて使う関数の説明のマニュアルを良く読む。

sprite_set_range関数を見ると,スプライトで使えるキャラクタは,0〜127までと書いてある。
偶然 102〜105を使っているので,これは問題無い。

sprite_set_location関数を見ると,あ! 表示位置の範囲が 0〜255になっている。
この数値から考えると,pixcel単位で指定するのが正しいようだ。

void rCenterPoint(void){
/*中心位置スプライト表示*/
font_set_colordata(102, 2*2, bmp_center);
sprite_set_range(102, 4);
sprite_set_location(102, 64, 48);
sprite_set_location(103, 72, 48);
sprite_set_location(104, 64, 56);
sprite_set_location(105, 72, 56);
}
が正しいコーディングですね(^^;

実行してみると,何も表示されなかった(;_;)
考えてみれば,表示位置が異なっても,画面上に何か表示されていなければおかしいので,これが原因では無いのでした。

私はパソコンユーザーですので,スプライトなるものは扱った事が無いので,仕様自体を勘違いしている可能性がありますね。
スプライトの説明をマニュアルで見ると,どうやらスクリーン2との兼ね合いがありそうだと分かった。

ありました! sprite_set_char関数のパラメータ中に,スクリーン2に対する優先度なるものが。
これをスプライト優先にしてみましょう。

void rCenterPoint(void){
/*中心位置スプライト表示*/
font_set_colordata(102, 2*2, bmp_center);
sprite_set_range(102, 4);
sprite_set_char(102, 102 + 8192);
sprite_set_char(103, 103 + 8192);
sprite_set_char(104, 104 + 8192);
sprite_set_char(105, 105 + 8192);
sprite_set_location(102, 64, 48);
sprite_set_location(103, 72, 48);
sprite_set_location(104, 64, 56);
sprite_set_location(105, 72, 56);
}
え? 何 8192って? だって bit13を立てるようにマニュアルに書いてあるから……。
ビット演算とかすると,後で分かり辛いので,ストレートに数値を書きました。
どうせソース見返す時にはマニュアル見ないとパラメータなんて分からないのだから,この位ストレートな方が良いのですよ(^^;

実行してみると,ちゃんと表示されました(^_^)
……が,背景が塗りつぶされてしまいました。
どうやら,透過色の設定がマズいようです(と言うか,どこにも設定していない(^^;)

・透過色の設定

まずは透過色とは何か? をマニュアルで調べてみましょう。
palette_set_color関数によると,パレット番号 4〜7,12〜15のビットパターン 00は無条件で透過色になるらしい。

パレット? そう言えば,これまでのプログラミングで一度も扱っていない。
白,黒,グレーしか使っていないので,操作する必要が無かったのだ。

ふと見ると,sprite_set_char関数のパラメータにパレット番号指定もある。
もしかして,パレット番号 12に設定すると,白の部分が透過するのでは無いだろうか?

void rCenterPoint(void){
/*中心位置表示*/
font_set_colordata(102, 2*2, bmp_center);
sprite_set_range(102, 4);
sprite_set_char(102, 102 + 8192 + 2048);
sprite_set_char(103, 103 + 8192 + 2048);
sprite_set_char(104, 104 + 8192 + 2048);
sprite_set_char(105, 105 + 8192 + 2048);
sprite_set_location(102, 64, 48);
sprite_set_location(103, 72, 48);
sprite_set_location(104, 64, 56);
sprite_set_location(105, 72, 56);
}
またか!? と思われているでしょうが(^^;,bit11を立てて,パレット番号 12を使うように指定したいのです。

実行してみると,うまく表示されました(^_^)
これで自分の位置が分かりやすくなりました。

トップメニューワンダーウィッチ