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

・ボタン入力を判定する

ずっと使っている key_wait関数だが,ボタン入力待ち状態にする以外の意味は無い。
マニュアルを見ると,返り値に押されたボタンが返って来るらしい。

unsigned char hRet;
hRet=key_wait();
if (hRet == 2){
rMsgText("PUSH START!!");
}
hRet=key_wait();
で,スタートボタンが押されたら,文字列が表示されるはずだ。

OK! ちゃんと表示された(^_^)
……が,バグが発覚した。テキストエリアをクリアするのを忘れている(^^;
これでは上書きされてしまい,重複表示になってしまう。

/*テキスト領域クリア*/
text_window_init(1, 14, 16, 3, 464);
をメッセージ表示前に入れる事にする。

・Xボタンでマップ移動させる

スピ魅はリアルタイム型では無いので,簡単な key_wait関数を使う事にする。

#define cBOT_START 2
#define cBOT_A 4
#define cBOT_B 8
#define cBOT_X1 16
#define cBOT_X2 32
#define cBOT_X3 64
#define cBOT_X4 128
#define cBOT_Y1 256
#define cBOT_Y2 512
#define cBOT_Y3 1024
#define cBOT_Y4 2048

unsigned char rKeyin(void){
unsigned short hRet;
hRet = key_wait();
switch (hRet){
case 2:
return cBOT_START;
case 4:
return cBOT_A;
case 8:
return cBOT_B;
case 16:
return cBOT_X1;
case 32:
return cBOT_X2;
case 64:
return cBOT_X3;
case 128:
return cBOT_X4;
case 256:
return cBOT_Y1;
case 512:
return cBOT_Y2;
case 1024:
return cBOT_Y3;
case 2048:
return cBOT_Y4;
}
}

そして,main関数に読み出し部分を追加する。
STARTを押したら終了する事にする。
void main(void){
unsigned short hRet;
font_set_colordata(100, 1, bmp_space);
screen_fill_char(SCREEN2, 0, 0, 28, 18, 100);
rMsgText("1234567890123456");
rMsgText("1234567890123456");
rMsgText("1234567890123456");
rWaku();
rSetMapC();
rMapView(38, 19);
for ( ; ; ){
hRet=rKeyin();
switch (hRet){
case cBOT_START:
goto EndJump;
break;
}
}
EndJump:;
}

これを実行して,STARTボタンを押して終了すれば成功だ。
うまくいった(^_^)

次に,Xボタンを取得して,マップを描き変えるようにする。
現在の場所を x, y変数に格納して保持する事にした。
void main(void){
unsigned short hRet;
int x, y;
font_set_colordata(100, 1, bmp_space);
screen_fill_char(SCREEN2, 0, 0, 28, 18, 100);
rMsgText("1234567890123456");
rMsgText("1234567890123456");
rMsgText("1234567890123456");
rWaku();
rSetMapC();
x=38;
y=19;
for ( ; ; ){
rMapView(x, y);
hRet=rKeyin();
switch (hRet){
case cBOT_X1:
y--;
break;
case cBOT_X2:
x++;
break;
case cBOT_X3:
y++;
break;
case cBOT_X4:
x--;
break;
case cBOT_START:
goto EndJump;
break;
}
}
EndJump:;
}

実行してみると,想像していたよりもずっと速いスピードで動いた。
ボタンはリアルタイムに取得しなくても,十分速いようだ。

・移動判定をする

すっかり忘れていたが,このままではどこへでも移動出来てしまう。
移動できないところをちゃんと判定する必要がある。
スピ魅では,確かマップデータの偶数は移動できて,奇数は移動できない,と言う定義だったはずだ(作ったのがかなり前なので,覚えていない(^^;)

case cBOT_X1:
if (md[(y - 1) * 50 + x] % 2 == 0) y--;
break;
case cBOT_X2:
if (md[y * 50 + (x + 1)] % 2 == 0) x++;
break;
case cBOT_X3:
if (md[(y + 1) * 50 + x] % 2 == 0) y++;
break;
case cBOT_X4:
if (md[y * 50 + (x - 1)] % 2 == 0) x--;
break;

・まとめ

リアルタイム処理では無い為,あっさりと解析できてしまった。
ボタン入力部分のみのソースを書きます。

/*ボタン入力返り値*/
#define cBOT_START 2
#define cBOT_A 4
#define cBOT_B 8
#define cBOT_X1 16
#define cBOT_X2 32
#define cBOT_X3 64
#define cBOT_X4 128
#define cBOT_Y1 256
#define cBOT_Y2 512
#define cBOT_Y3 1024
#define cBOT_Y4 2048

unsigned char rKeyin(void){
/*ボタン入力判定関数*/
unsigned short hRet;
hRet = key_wait();
switch (hRet){
case 2:
return cBOT_START;
case 4:
return cBOT_A;
case 8:
return cBOT_B;
case 16:
return cBOT_X1;
case 32:
return cBOT_X2;
case 64:
return cBOT_X3;
case 128:
return cBOT_X4;
case 256:
return cBOT_Y1;
case 512:
return cBOT_Y2;
case 1024:
return cBOT_Y3;
case 2048:
return cBOT_Y4;
}
}

void main(void){
unsigned short hRet;
int x, y;
font_set_colordata(100, 1, bmp_space);
screen_fill_char(SCREEN2, 0, 0, 28, 18, 100);
rMsgText("1234567890123456");
rMsgText("1234567890123456");
rMsgText("1234567890123456");
rWaku();
rSetMapC();
x=38;
y=19;
for ( ; ; ){
rMapView(x, y);
hRet=rKeyin();
switch (hRet){
case cBOT_X1:
if (md[(y - 1) * 50 + x] % 2 == 0) y--;
break;
case cBOT_X2:
if (md[y * 50 + (x + 1)] % 2 == 0) x++;
break;
case cBOT_X3:
if (md[(y + 1) * 50 + x] % 2 == 0) y++;
break;
case cBOT_X4:
if (md[y * 50 + (x - 1)] % 2 == 0) x--;
break;
case cBOT_START:
goto EndJump;
break;
}
}
EndJump:;
}

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