“RUN” それは魔法の言葉

私とコンピュータの思い出を、だらだらと綴ります。

57.ゲーム&ウォッチのマンホールを作ろう その4

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