次は工具の落下処理を作っていく。
工具は5種類で、それぞれ5か所落ちると地面になる。
「マンホール」の時に使った、ビットシフトでの管理を行ってみる。今回は5列あるので、配列変数で管理する。
はじめは「マンホール」と同じように、上から下に落ちていく方向にビットが減るようにシフト(右シフト)を行うつもりだった。
右シフトし続ければ、最後のビットを追い出してしまえるので、画面外に出たという処理が不要になる。
そして、シフトした後、各ビットが1になっているときに、その位置の工具を表示すればいい。
「マンホール」の通行人は、画面外にいなくなればいいので、これでよかったが、ヘルメットでは、工具が地面に3つ落ちたら1点と、落ちた数をカウントしなくてはならない。
そうすると、右シフトで追い出されたビットが1なのかを判定しなくてはならない。これだと処理が面倒。
そこで、逆順にして左シフトすることにした。
5ビットしかないから、事実上の桁あふれは気にせずに、単に6ビット目の32が立ったら、カウントして、-32すればいい。
このとき、工具が落ちたという判定になり、カウンタを+1して、3になったらスコアを足す。
あとは、1ゲームサイクルで、1ラインずつ処理する。
HSPのビット演算は、>>と<<で書く。
工具の落下処理とともに、落下個数とゲームスピードの調整も作成した。
if gamecnt\g_speed=0 { ;工具の落下処理フレームなら ;1ライン分だけ、工具を落とす toolline(toollinecnt)<<1 ;地面に落下した判定 if (toolline(toollinecnt)&32)=32 { falltoolcnt+ toolline(toollinecnt)=toolline(toollinecnt)-32 falltools- if falltoolcnt=3 { ;工具3つが地面に落ちたら1点 score+ falltoolcnt=0 } } ;工具を追加する? if falltools < maxtools { if rnd(10)>3 and (toolline(toollinecnt)&3)=0 { ;必ず1つ以上あける toolline(toollinecnt)=toolline(toollinecnt)+1 falltools+ } } ;動かす工具のラインを進める toollinecnt+ mmplay toollinecnt+1 if toollinecnt >=5 : toollinecnt=0 } *showtools ;工具の表示 repeat 5 j=cnt repeat 5 if toolline(j)&(1<<cnt) { pos toolx(j),tooly(cnt,j) celput 10+j,cnt } loop loop ;スコアアップによる調整 ;最大工具数 maxtools = 4+(score\100>10)+(score\100>50)+((gamemode=1)*(score\100>80)) ;ゲームスピード g_speed = g_speed_def-(score\100>10)-(score\100>30)-(score\100>50)-(score\100>80) return
そうして、できたのがこれ。
まだ、作業員の当たり判定も、事務所に入った判定もないけど、それっぽくなってきた。