“RUN” それは魔法の言葉

私とコンピュータの思い出を、だらだらと綴ります。最近はHSP3でのゲーム作り日記です

87.HSPでゲーム&ウォッチのヘルメットを作ろう その5

次は工具の落下処理を作っていく。
工具は5種類で、それぞれ5か所落ちると地面になる。
「マンホール」の時に使った、ビットシフトでの管理を行ってみる。今回は5列あるので、配列変数で管理する。

はじめは「マンホール」と同じように、上から下に落ちていく方向にビットが減るようにシフト(右シフト)を行うつもりだった。
右シフトし続ければ、最後のビットを追い出してしまえるので、画面外に出たという処理が不要になる。
そして、シフトした後、各ビットが1になっているときに、その位置の工具を表示すればいい。

「マンホール」の通行人は、画面外にいなくなればいいので、これでよかったが、ヘルメットでは、工具が地面に3つ落ちたら1点と、落ちた数をカウントしなくてはならない。
そうすると、右シフトで追い出されたビットが1なのかを判定しなくてはならない。これだと処理が面倒。
そこで、逆順にして左シフトすることにした。

5ビットしかないから、事実上の桁あふれは気にせずに、単に6ビット目の32が立ったら、カウントして、-32すればいい。
このとき、工具が落ちたという判定になり、カウンタを+1して、3になったらスコアを足す。

f:id:CORO3:20210530222532j:plain

あとは、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

そうして、できたのがこれ。
まだ、作業員の当たり判定も、事務所に入った判定もないけど、それっぽくなってきた。

youtu.be