2021年の初エントリーです。今年もよろしくお願い致します。
通行人を移動する処理をどうしようかと考えた。
通行人を左端(右端)から出現させたら、配列に場所を持たせて、カウントアップしていこうかと最初は思っていた。
でも、同時に10人程度表示されるようになるので、判定処理も面倒そうだなと却下。
そして、ふと思いついたのが、ビット演算。10カ所の表示位置があるので、それぞれビットとして扱い、ビットシフトさせることにした。
SHIFT関数を使って、右にビットを1つずつシフトしていく。
スタート:1000000000
↓ SHIFT
0100000000
↓ SHIFT
0010000000
ビットシフト演算のいいところは、シフトした一番右端のビットが、そのままなくなること。
だから、出現させて10回シフトさせたら、自動的に通行人が消えることになる。
出現させるには、一番左のビットを1にすればいい。10ビットなので左端は512。出現のタイミングで、512を足すだけでいい。
方向は上下で逆になるけど、考え方は同じ。
このビットの数値を変数に持ち、今度は各ビットごとに0か1かを取り出して、通行人のグラフィックのオン/オフを切り替えることにした。
ソースから抜粋したが、この移動処理に、ミスターマンホールが受け止めたらスコアを足して、いなければミスの処理にGOSUBで飛ぶようにもしている。
pa_cont: %通行人表示制御と判定 FOR k=10 TO 1 STEP -1 %10カ所分を処理 %とりあえず通行人の表示を消す GR.HIDE(pa_obj[1,k]) GR.HIDE(pa_obj[2,k]) %上段の判定 %各ビットが1になっているかを判定 IF BAND(upa,2^(k-1)) = 2^(k-1) THEN GR.SHOW(pa_obj[1,k]) SW.BEGIN k SW.CASE 7 %穴があいてるポジションだったら IF pos=1 THEN %マンホールマンがそのポジションにいるか? sc+=1 SOUNDPOOL.PLAY sp,3,0.99,0.99 VIBRATE vpt[],-1 ELSE miss+=1 GR.HIDE(pa_obj[1,k]) upa-=2^(k-1) mis_pos=1 GOSUB miss_1 K=11 ENDIF SW.BREAK SW.CASE 4 IF pos=2 THEN sc+=1 SOUNDPOOL.PLAY sp,3,0.99,0.99 VIBRATE vpt[],-1 ELSE miss+=1 GR.HIDE(pa_obj[1,k]) upa-=2^(k-1) mis_pos=2 GOSUB miss_1 k=11 ENDIF SW.BREAK SW.END ENDIF %下段の判定 IF BAND(dpa,2^(k-1)) = 2^(k-1) THEN GR.SHOW(pa_obj[2,k]) SW.BEGIN k SW.CASE 7 IF pos=4 THEN sc+=1 SOUNDPOOL.PLAY sp,3,0.99,0.99 VIBRATE vpt[],-1 ELSE miss+=1 GR.HIDE(pa_obj[2,k]) dpa-=2^(k-1) mis_pos=4 GOSUB miss_1 K=11 ENDIF SW.BREAK SW.CASE 4 IF pos=3 THEN sc+=1 SOUNDPOOL.PLAY sp,3,0.99,0.99 VIBRATE vpt[],-1 ELSE miss+=1 GR.HIDE(pa_obj[2,k]) dpa-=2^(k-1) mis_pos=3 GOSUB miss_1 K=11 ENDIF SW.BREAK SW.END ENDIF NEXT RETURN