・パレット操作しよう
移動すると,1つの問題があった。どこが移動出来るのかが,良く分からないのだ。
壁も通路も岩模様で,床のところどころは壁よりも遙に濃い。
なぜそんな事になるのかと言えば,元のCGが,床は茶色で,壁は灰色だからだ。
あ! そうだ! この前研究したパレット操作すればいいじゃん!
……あの研究結論がムダで終らせたと思うが,早速役に立つゾ(^^;
薄い色のみをキャラクタパレットに割り当てる事にする。
但し,LCDパレットは触わらない事にします(枠とかの関係があるので……)
palette_set_color(0, 0x7530);
palette_set_color(1, 0x4321);
のようにパレットをセットします。
この1番パレットを通過できるキャラクタへセットします。
unsigned chara_mc02s[]={12 + 512, 13 + 512, 14 + 512, 15 + 512};
unsigned chara_mc02s1100[]={13 + 512}; /*左下*/
unsigned chara_mc02s1200[]={12 + 512, 13 + 512}; /*下*/
unsigned chara_mc02s1300[]={12 + 512}; /*右下*/
unsigned chara_mc02s1400[]={13 + 512, 15 + 512}; /*左*/
unsigned chara_mc02s1600[]={12 + 512, 14 + 512}; /*右*/
unsigned chara_mc02s1700[]={15 + 512}; /*左上*/
unsigned chara_mc02s1800[]={14 + 512, 15 + 512}; /*上*/
unsigned chara_mc02s1900[]={14 + 512}; /*右上*/
こんな感じに,偶数番号のマップキャラへ,1番パレットをセットします。
512は 9ビット目を立てる事を意味します(マニュアル参照のこと)
これで,とりあえず通過できる場所と,出来ない場所が分かるようになりました。
見辛い点は変わりありませんね。
ちゃんとしたゲームを作る際には,注意しなければならない点でしょう。・シナリオを移植
さて,これでゲームシステムは完成しました。
後は,シナリオを PART2のものに入れかえるだけですね。
ルンル♪ ルンル♪ (音符マークでない人ごめんなさい)
とシナリオを移植していたら,ふとある事に気が付いた。
テキスト領域以外の場所に文字表示が出来ない!!
これが出来ないと,右にあるステータス表示欄にパラメータが表示出来ないゾ。
マニュアルにはフォント取得関数が見当らないので,インクルードファイルを検索していたら,凄い事を発見しました。
ファイルの中にマニュアルがある! しかも本よりも格段に詳しい!
……と言うわけで,それを検索するとあっさりと,text_get_fontdata関数が見つかりました。
本よりもこっちの方が格段にいいじゃん。検索出来るし。
例えば‘★’を表示させたい場合は,
BYTE hFontData[8];
BYTE hFontNum[1];
hFontNum[0]=200;
text_get_fontdata('★', hFontData);
font_set_monodata(200, 1, hFontData);
screen_set_char(SCREEN2, 0, 0, 1, 1, hFontNum);
みたいな感じで表示出来る……あれ? 確かに何か表示しようとはしているものの,何も表示されない(;_;)
スクリーンを変えてみたり,変数サイズを変えてみたり,色々やったものの変化が無い……
試行錯誤の結果,今まで謎だった部分も全て解明されました。
実は,screen_set_charで指定するキャラクタ番号の値は,常に実在しなければなりません。
どういう事かというと。
static BYTE hFontNum[1];
でなければならないと言う事です。
C言語の関数は,御存知の通り,実行後は変数の中身は保証されません(と言うか消えます)
それではダメなのです。表示している間,ずっと変数の値が存在しなければなりません。
今まで,全ての変数を関数の外で代入していたのは,実はそうしなければうまく動作しなかった為です。
これを知った事で,かなりプログラムサイズを縮められると思います。
その反面,font_set_monodata関数または,font_set_colordata関数で使用した変数は,すぐに初期化しても良い事が分かりました。
つまり,プログラムでデータ生成を行なって,セットした後は破棄しても良いと言うことです。
void rStatus(void){
/*ステータス表示*/
static hFontNum[46];
BYTE hFontData[8];
int i;
/*キャラクタ番号をセット*/
for(i=45; i >= 0; i--){
/*463の根拠は,テキスト領域を464から取っている為*/
hFontNum[i]=463 - i;
}
/*文字表示*/
text_get_fontdata('バ', hFontData);
font_set_monodata(hFontNum[0], 1, hFontData);
text_get_fontdata('ー', hFontData);
font_set_monodata(hFontNum[1], 1, hFontData);
text_get_fontdata('タ', hFontData);
font_set_monodata(hFontNum[2], 1, hFontData);
text_get_fontdata('ス', hFontData);
font_set_monodata(hFontNum[3], 1, hFontData);
text_get_fontdata('・', hFontData);
font_set_monodata(hFontNum[4], 1, hFontData);
text_get_fontdata('ウ', hFontData);
font_set_monodata(hFontNum[5], 1, hFontData);
text_get_fontdata('ォ', hFontData);
font_set_monodata(hFontNum[6], 1, hFontData);
text_get_fontdata('ー', hFontData);
font_set_monodata(hFontNum[7], 1, hFontData);
screen_set_char(SCREEN1, 19, 3, 8, 1, &hFontNum[0]);
text_get_fontdata('レ', hFontData);
font_set_monodata(hFontNum[8], 1, hFontData);
screen_set_char(SCREEN1, 19, 4, 1, 1, &hFontNum[8]);
〜以下省略〜
こんな感じでテキスト領域以外にも文字を表示可能です。
あ! 6人パーティなのに表示欄が5つしかない! まぁいいか,特にパラメータ表示するわけでは無いし(^^;
ちゃんとしたゲームを作る時は5人パーティーまでと……(メモメモ)