“RUN” それは魔法の言葉

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

184.HSPでゲームを作ろう:竜巻鮫 その6

次はサメの落下処理。
これは、ほぼ今までのGW再現シリーズと同じ。特に各ラインの落下コマ数を変えたので、「パラシュート」のプログラムがほぼそのまま使えた。

coro3.hatenablog.jp

今回は、ヤシの木にダイバーが引っかかるような、タイミング外しのギミックは入れる(考える)余裕がなかったので、GAME Bでは4ライン目を追加してみた。
そして、パラシュートでは、ずいぶんと間抜けな処理を入れていた…
2のn乗を計算するのに、Powf命令を使って、実数だからと、intでキャストしないといけないね、とか…
右シフトとか、左シフトとか、シフト演算を偉そうに語って使っていたのに、2のn乗をシフト演算でできるって考えてないというね…
ま、そこは凡人のオッサンということでお許しをww
もちろん、今回はシフト演算に作り替えておきました。

閑話休題
処理の流れは、特定のフレーム数になったら、1ラインずつ動かす(右シフト)する、その時最大のサメ出現数に達しておらず、出現条件(三分の一の確率、1マス以上空いている)を満たしたら、サメを足す。
と、日本語一文で書くと、何言ってんの?この人って言われそうww
プログラムだと、こんな感じ。

if gamecnt\g_speed=0 { ;サメの落下処理フレームなら
  ;1ライン分だけ、サメを落とす
  sharkline(sharklinecnt)<<1

  ;落下した判定
  falldef=sharkfall(sharklinecnt)<<1;ラインごとに落下位置が違うため計算
  if (sharkline(sharklinecnt)&falldef)=falldef {
    ;落下したときの処理
    sharkline(sharklinecnt)=sharkline(sharklinecnt)-falldef ;ラインからサメを消す
    fallsharks-- ;落下するサメの数を1減らす
  }

  ;サメを追加する?
  if fallsharks < maxsharks {
    if rnd(10)>3 and (sharkline(sharklinecnt)&3)=0 { ;必ず1つ以上あける
      sharkline(sharklinecnt)++
      fallsharks++
    }
  }

  ;動かすサメのラインを進める
  sharklinecnt++
  if sharklinecnt>=4 : sharklinecnt=0

あとは落下したときの処理部分に、ミスの判定や、ミス時演出のためのフラグ、変数を設定する処理を書いていく。

183.HSPでゲームを作ろう:竜巻鮫 その5

次はチェーンソーの処理。
アタックボタンを押しているときだけ、チェーンソーを表示するのはフラグ管理で問題なし。
今回は、押しっぱなしにしていると、チェーンソーがオーバーヒートして、使えなくなるようにする。

まずは、ボタンを押したら温度を上げ、離したら下げる処理を、アタックボタンの押した判定、離した判定のところに入れる。
どれくらいの加減がよいのか分からないので、とりあえず±1ずつしてみる。
温度の最大値(オーバーヒート)は、とりあえず1000にして、変数で変えられるようにしておく。

温度の上昇時には、オーバーヒートの判定処理を加える。
オーバーヒートは、状態が二段階あって、

  1. チェーンソーが点滅する状態。ボタンを離して温度が下がれば解除される
  2. 点滅状態でサメを倒すと、消えてしまい、温度が下がっても復活しない→次のサメ落下でミス確定

これらを、1つのフラグで処理することにした。

オーバーヒートフラグ → 0:通常、1:オーバーヒート状態、2:消滅状態

ここまでは、サメの落下や、キャッチの判定を作っていなかったので、細かな調整はしなかった。

そして、温度の状態を示す温度メーター。4段階に目盛りが増える。
オーバーヒート状態になったら、チェーンソー同様、点滅表示させる。
目盛りの増減は、いつもの除算の余りを使って制御。
点滅は、これまた何度も出てきたXOR(排他的論理和)を使って、0と1を繰り返し変更するフラグを作って、片方(今回は0の時)だけ、チェーンソーを表示するようにした。
こんな感じで、if文だらけの汚いソースにw

;チェーンソーを表示する
if attackflg=1 and ohflg<2 {
  if ohflg=1 and gamecnt\30=0 : sawflash=sawflash^1
  if sawflash=0 {
    pos sawx(ppos),sawy(ppos)
    gmode 2 : celput 4,ppos
  }
}

;チェーンソーの温度計表示
tmpstep=sawtmp/(maxtmp/4)+1
tmpstep=limit(tmpstep,0,4)

if sawflash=0 and tmpstep>0 and sawtmp>0 {
  pos 632,540
  gmode 2 : celput 16,tmpstep-1
}

182.HSPでゲームを作ろう:竜巻鮫 その4

素材を切り出して、プレイヤーを表示できるようにしたら、いよいよゲームの実装に取り掛かる。

まずはプレイヤーを動かす処理から。といっても一からコードを書かなくても、過去のGW再現シリーズからのソースを流用できるので、楽。

変更するのは、筐体画像のボタンの位置に合わせた座標判定の値だけ♪
と思っていたのだが、そのままは使えなかった…

いままでのGW再現シリーズは、基本的に2ボタンで、プレイヤー移動しかなく、同時押しが必要なゲームは無かった。

今回はアタックボタンを押しながら、プレイヤーを移動せねばならないのだが、今のプログラムはマルチタッチを無視wした作りになっており、2本以上タッチしていると、どちらかの指の情報を拾ってないことになる。

ただ、これは私のプログラムの作りが問題なのであって、HSP3Dishでは、ちゃんとマルチタッチの情報取得が可能になっている。
竜巻鮫では、同時押しするのは2本になるけど、一応何本の指で押しても大丈夫なようにしてみた。

移動のボタンは、処理順が若い方を優先。移動ボタンを2本で同時に押しても、片方しか有効にしない。(体勢的にやらないと思うけど)

アタックボタンは、押しっぱなしにできるようにする。ただし移動ボタンは押しっぱなしにしても移動しないようにせねばならない。
処理を変えなくてはならず、ちと面倒w

今までは、タッチしていない状態を検知すればよかったけど、今回はアタックボタンがあるからそれができない。
さらに、押していたとしても、タッチ座標がボタン上になければ、指を離したのと同じにしなくてはならない。

悩んだ挙句、1本ずつ調べて、押した、押してないのフラグと、押したカウンタを使って判定する方法で、未タッチを含む、移動、アタックの処理を作ることができた。
この処理をクリアできなかったら、コンテストの〆切に間に合わない!と焦ったのは内緒w

これでマルチタッチの基本ノウハウが、多少なりとも出来たので、次回作以降が楽になったかな。

181.HSPでゲームを作ろう:オリジナルGW風ゲーム→竜巻鮫 その3

このゲームは、一部の映画ファンには大人気の、某竜巻な鮫映画をモチーフにしている。
その名も「竜巻鮫」ww ベッタベタですみません。

ゲーム内容はこんな感じ。

  • サメは全部で4ラインに降ってくる。GAME Aは3ライン、GAME Bは4ライン。
  • サメが最下部に来た時に、アタックボタンを押してチェーンソーで倒す。
  • 200点と500点でミスがクリアされる。この時ノーミスなら、次にミスするまで得点が2倍になるボーナスタイムに。
  • アタックボタンを押している間、チェーンソーの温度が上がり、オーバーヒートすると使えなくなる。
  • 999点でカンスト(予定)
  • 音量調整&オフにする機能、ポーズ機能を搭載

今まで作っていたGW再現では、キャッチ系というもので、対象物が落下もしくは通過するときにプレイヤーがいれば得点になるもの。今回作る竜巻鮫も、同じようにサメがどんどん落ちてくるんだけど、一つアクションを加えることにした。

アタックボタンでチェーンソー(なぜかは某映画を観てねw)を出しているときだけ、サメをやっつけられるようにする。
ただ、アタックボタンを押したままにするのは簡単になるので、使い続けるとオーバーヒートする仕組みにした。

ゲームデザインは、昭和のゲームウォッチのテイストを残しつつ、少しアレンジを加える程度にしている。