“RUN” それは魔法の言葉

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

103.HSPでゲーム&ウォッチのパラシュートを作ろう その4

スカイダイバーのキャッチとミスの判定を作ってゲームの形にする。

3ラインの落下パターンがそれぞれ違うので、キャッチした、着水した(=ミス)を判定する値も変わる。
ポジション数を配列で管理したので、その値を使って計算した値を使うことにした。

救助ボートの位置と一致するラインで、一番下まで落下しているダイバーがいればキャッチしたとして、ライン管理している変数から値を引く。
この時の一番下のラインの値は、2のn乗の値なので、powf関数を使って計算する。そして落とし穴があった。
関数の仕様をちゃんと読めば書いているのだが、powf関数の戻り値は実数だった。
例えば、powf(2,2)とした場合、期待する値は2の2乗=4なのだが、4.0と返ってくる。
この計算結果を整数と論理積(AND)を取ると一致しないのだ。(ま、これも当たり前なのだが。)
なので、int関数を使って整数化しておく必要があった。

;ダイバーのキャッチ判定
 diverfalldef=int(powf(2,diverposnum(px)-1))
 if (diverline(px)&diverfalldef)=diverfalldef {
  diverline(px)=diverline(px)-diverfalldef
  falldivers-
  score+
 }

無事キャッチ判定は出来たのだが、キャッチ判定はどのフレームでも行っているので、ダイバーの表示タイミングと合うと、ほぼワープしたように消えてしまう。
実機の動画を見る限りでも、ほぼ瞬間的に消えてはいるが、目で追えるぐらいのスピード。これは調整しないとだめかな。
ただ、面倒なので後回しにw

次はミス判定。
こちらも基本はキャッチ判定と同じ。ラインを進めたタイミングで、キャッチするラインを越えたらミスフラグを立てる処理を追加した。

;落下した判定
 diverfalldef=int(powf(2,diverposnum(diverlinecnt))) ;ラインごとに落下位置が違うため計算
 if (diverline(diverlinecnt)&diverfalldef)=diverfalldef {
  diverline(diverlinecnt)=diverline(diverlinecnt)-diverfalldef
  falldivers-
 }

で、パラシュートでは、ミス時にちょっとしたアニメ演出があるので、そこも再現する。
着水すると、その後をサメに追っかけられて、ミスマークに変わる。
着水時は少し長め、アニメ中は少し早く、最後のアニメパターンはまた少し長めのフレームになるという面倒な演出w
フラグとベタ書きの処理で、それっぽく作成した。

これで、一通りゲームとしては遊べるようになった。