モグラの出現タイミングに関するロジックの全面作り直しを開始した。
前回洗い出したタイミングを元に、ステータスで管理することにした。
ステータスごとに何カウント分回すかを決めておいて、0になったり、モグラをたたいたりしたタイミングでステータスを変更して、次のカウントを開始する。
こうすれば、モグラをたたいたあとに次にモグラが出現するまでのタイミングを均一化できる。
- 子モグラがステージ最初に出現するタイミング
- 子モグラを叩いて、 数字モグラが出現するタイミング
- 子モグラが出現して、叩けず消すタイミング
- 数字モグラを叩けず消すタイミング
- 親モグラが出現するタイミング
- 親モグラを叩けず消すタイミング
それぞれのタイミングごとに、何フレーム後に発生するかを直前のイベント終了時に決めるようにした。
ステータスは単純に数字にするとわかりづらいので、プログラムの冒頭で#constを使って、定数として定義した。
定数はそのまま数値として判定できるので、switch文で、わかりやすく書けた。
#const FIRSTARV (0) #const CMOLEARV (1) #const CMOLEITV (2) #const NMOLEARV (3) #const NMOLEITV (4) #const PMOLEARVITV (5) #const PMOLEARV (6) #const PMOLEITV (7) molestate=FIRSTARV ;モグラの状態(ソース先頭に定数定義) dim molecnt,8 ;モグラの表示タイミング(フレームベース) molecnt=30,90,90,90,90,90,90,90 gamespeed=molecnt(CMOLEARV) *molearrival //モグラの出現、ミス処理 if gamecount=0 { switch molestate case FIRSTARV ; 一番最初と、子モグラが表示される時間が過ぎたとき molestate=CMOLEARV gamecount=molecnt(molestate) molenum=10 molepos=rnd(8)+1 swbreak case CMOLEARV ; 子モグラが表示される時間が過ぎたとき molestate=CMOLEITV gamecount=molecnt(molestate) molepos=0 swbreak case CMOLEITV moleattackcnt=0 ;連続退治のカウントクリア moleattackflg=1 ;ループを抜けるためのフラグをセット swbreak case NMOLEARV ; 数字モグラが表示される時間が過ぎたとき molestate=NMOLEITV gamecount=molecnt(molestate) molepos=0 swbreak case NMOLEITV ; 数字モグラを見逃しても、親モグラを表示する場合あり if pmoleflg=0 { moleattackflg=1 ;ループを抜けるためのフラグをセット } else { molestate=PMOLEARVITV gamecount=molecnt(molestate) molenum=0 } swbreak case PMOLEARVITV ; 親モグラ表示 molestate=PMOLEARV gamecount=molecnt(molestate) molenum=11 molepos=rnd(8)+1 pmoleflg=0 swbreak case PMOLEARV ; 親モグラが表示される時間が過ぎたとき molestate=PMOLEITV gamecount=molecnt(molestate) molepos=0 swbreak case PMOLEITV moleattackflg=1 ;ループを抜けるためのフラグをセット swbreak swend } else : gamecount- *showmole if molepos>0 { pos mtx(molepos-1),mty(molepos-1) celput 2,molenum } return
モグラを叩いた時の判定時もステータスとそのフレーム数をセットしてやることで、均一タイミングでモグラが出現するようにコントロールできた。
実機で遊んだのは、小学校の低学年。そのころの記憶と感覚を頼りにするのならば、満足のいく挙動になったと思う。
なので、オリジナルをそのまま再現ということはやっていない。それでも面白く遊べたらいいのだw