次は作業員と工具の当たり判定と、事務所に駆け込んだ時の処理を作る。
作業員の移動処理は、どのフレームでも受け付けている。
そのため、工具が落ちた時だけ判定すると、作業員の移動が勝って、すり抜けられてしまう。
これを防ぐ為に、今回は作業員の移動処理ごとに、工具との当たり判定を付けるようにした。
移動した位置pxと同じ場所に落ちてくる工具の管理変数toolline()で、最下段に工具がある=16になっていたら、ミスにすることにした。
ミスしたら、その工具は消さなくてはならないので、その処理も追加。管理変数toolline()の値から、-16すればいい。
そして、今回は再現になるべくこだわってみたいと思ったので、ミス時の他の処理についても似せて行くようにした。
まずは、ドアの開閉。
ミス時の作業員が表示されている短い間でも、カウンタは進んでおり、開閉する。
これを再現するには、ミス時の作業員表示をしているときも、ドアの開閉判定をしなくてはならない。
その間は工具の落下処理も止めなくてはならない。
ミス時は、missflgを1にすることで、各処理の前にmissflgの状態判定を追加した。
そして、ミスしたときは、中央にこけた作業員を数フレーム表示しなくてはならない。
この間もドアの開閉カウンタは動かし続ける。
if px>0 and px <6 { if (toolline(px-1)&16)=16 { ;一番下まで落下しているときにいたらミス ;ミス処理系 missflg=1 miss+ missf=0 startcnt=0 ;工具を消す toolline(px-1)=toolline(px-1)-16 falltools- ;スタート地点に戻す px=0 return } } *missprocess missf+ pos 467,413:celput 5 if missf>=60 { missf=0:missflg=0 } return
次は、事務所に駆け込んだ時の処理。
スコアを5点加算することはもちろんだけど、そのままスタート地点に戻す。
ただスタート地点に戻してしまうと、処理が速すぎて、ワープしたみたいになる。
ここでも専用のカウンタを作って、5フレームは、そのままドアの中に入ったポーズを表示するように工夫した。
;ドアに入った状態なら if px=6 { if goalcnt<=5 { goalcnt+:goto *showplayer } else : goalcnt=0 :px=0 } ;右ボタンを押したときに、ドアが開いていれば得点 if px=6 { if doorflg=1 { score=score+5 } else : px=5 }
これでひとまずゲームの形にはなった。