通行人の出現パターンをどうやって作るかの前に、移動処理と判定処理を作ってしまう。
パターンは、とりあえずダミーにする。
今回も通行人の位置はビットで管理して、シフト演算で進める。
そして、消えた後の判定は不要なので、右シフトで消えてもらうようにした。
BASIC!では、タイマー割込みで、上下段を一度に動かしていたが、HSPでは一定カウンタを進めるごとに、上→下→上→…と一段ずつ動かすようにしてみた。
BASIC!でのプログラムをベースに作り始めると、判定処理で面倒なことが発生。
上段と下段は、基本同じ処理なので、配列変数に通行人の状態を持たせて、1ビットずつ進めるのだが、進行方向が違うのだ。
BASIC!の時は、動けばよいのでw上下それぞれで、同じような処理を2つ書いていた。
今回は、一定フレームごとに上段、下段と動かすので、できれば処理を同じにしたい。
移動処理は、通行人の座標値を逆順に配列に格納したので、問題ないのだが、ミスターマンホールの位置を表す番号が問題になった。
上段 0 1 Lineno=0
下段 2 3 Lineno=1
という位置番号にしていたのだが、こうすると、下段のポジション判定が面倒。
そこで、下段の位置番号を左右逆にした。
上段 0 1 Lineno=0
下段 3 2 Lineno=1
こうすることで、上下のラインを表す番号をうまく利用して、位置情報をどちらも同じ数字にすることができた。
ppos-(passlineno*2)
ppos:ミスターマンホールの位置番号
passlineno:上段は0、下段は1
上段の時は、pposの値のまま、下段の時は必ずpposから2が引かれ、0と1だけになる。
って、たいそうなことのように書いているが、ブログ主の知識や考え方は、ほぼ高校時のレベルで止まっているのでご勘弁を。
こんな感じで、昔BASICでプログラムを作っていたオッサンなのねと思っていただけると。
*passermove ;通行人の表示・移動ルーチン if gamecnt\g_speed=0 and missflg=0 { ;通行人の処理フレームなら ;上か下かどちらか一方のラインだけ、通行人を1つ進める passline(passlineno)>>1 linecnt++ ;落下orキャッチ? if ((passline(passlineno)&64)=64 or (passline(passlineno)&8)=8) { ;ミスしたときの処理 ifpos=ppos-(passlineno*2) ;判定用のポジション if (passline(passlineno)&64)=64 { if ifpos=0 { score++ } else { passline(passlineno)=passline(passlineno)-64 miss++ missflg=1 misspos=0+(passlineno*2) } } if (passline(passlineno)&8)=8 { if ifpos=1 { score++ } else { passline(passlineno)=passline(passlineno)-8 miss++ missflg=1 misspos=1+(passlineno*2) } } } ;動かす通行人のラインを切り替える passlineno = passlineno^1 } *showpasser ;通行人の表示 repeat 2 j=cnt repeat 10 if passline(j)=0 : break if passline(j)&(512>>cnt) { pos passerx(cnt,j),passery(cnt,j) celput 10+j,cnt } loop loop return