“RUN” それは魔法の言葉

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

115.HSPでゲーム&ウォッチのマンホールを作り直そう その4

通行人の出現パターンをどうやって作るかの前に、移動処理と判定処理を作ってしまう。
パターンは、とりあえずダミーにする。

今回も通行人の位置はビットで管理して、シフト演算で進める。
そして、消えた後の判定は不要なので、右シフトで消えてもらうようにした。
BASIC!では、タイマー割込みで、上下段を一度に動かしていたが、HSPでは一定カウンタを進めるごとに、上→下→上→…と一段ずつ動かすようにしてみた。

BASIC!でのプログラムをベースに作り始めると、判定処理で面倒なことが発生。
上段と下段は、基本同じ処理なので、配列変数に通行人の状態を持たせて、1ビットずつ進めるのだが、進行方向が違うのだ。

BASIC!の時は、動けばよいのでw上下それぞれで、同じような処理を2つ書いていた。
今回は、一定フレームごとに上段、下段と動かすので、できれば処理を同じにしたい。

移動処理は、通行人の座標値を逆順に配列に格納したので、問題ないのだが、ミスターマンホールの位置を表す番号が問題になった。

 上段   Lineno=0
 下段   Lineno=1
という位置番号にしていたのだが、こうすると、下段のポジション判定が面倒。

そこで、下段の位置番号を左右逆にした。
 上段   Lineno=0
 下段   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