前回謎のパニックが起こった理由・・全く心当たりがなかったが、整数しか扱えないUsizeがらみとすれば、座標が範囲外のマイナスになる事しかない。
感覚的には、Y=0になったところで方向は上を向いてるのだからDown方向の評価はされないような気がしてたけど、現在の向きとは無関係に計算がされてるのか!?と。対策のためにY=0やX=0の場合はマイナスを行わないようにしてみると・・・
コーナリングの際にキャラが1つになるけど概ね想定通りの動きが出来るようになった!これで妥協しておくべきだろう!やったぜ!
続いてAnimalの麻酔銃への耐久度が0になった場合に動きを止めるためにCapturedとSleep状態以外のみUpadateを行うように変更して
CapturedがPlayerに運ばれている状態だとするとケージに閉じ込められている状態も別に作らないといけなのでJailedってのを追加して
Animal表示メソッドの例外にCapturedとJailedを設定して
PlayerのフィールドにAnimal運搬中のフラグとしてCarryを設定し
インスタンスの初期値としてFalseを入れて
Sleep状態のAnimalの座標とPlayerの座標が重なったらCaptured状態にするようにして・・その他、Carry中にはPlayerの背後に運搬中のキャラクターを表示するという機能を実装してみる。Display_player関数の引数にAnimalインスタンスを入れるようにして・・表示部分はいつもの通りで実装した結果・・
うむ。耐久度0になったAnimalは動きを止め、座標が重なるとCaptured状態になって表示も(不完全だが)行えているな!
だが、この前のキャラクターを解消するのに相当手間がかかってしまった・・この時点で掃除の時間になったのでモップがけしてたところで
「あっ!良いこと考えた・・キャラクター共通で1つ前の座標を保存しておくベクターを用意しておいて、移動のたびにそこに1つ前の座標を追加、ループの最後に消去するようにすれば一括で管理出来るじゃないか!」
と。で、実装に向けて挑戦してみたんだけど・・なんか変更点が多くなりすぎる上に本当に出来るか分からないので途中で断念。まずは完成させないとな、と。
原案は複数の座標をベクターに格納するつもりだったけど、とりあえず捕獲したAnimalだけにすることにしたので変数をタプルのみに変更
Display_playerメソッドの引数に古い座標を送り込み
メソッドの方でも受け取るようにして
Display_playerの内部でまずCarry中でなければ今までどおりの表示。
Carry中ならPlayerの背後に捕獲キャラ表示、そこが森でなかった場合のみ表示、同時にその座標を参照を外したOld_coordinateに保存
古い座標にあるキャラクターの消去は方向転換の時ではなくて一歩動いた時にするために、Go_forwardにOld_coordinateを受け取るようにして
古い座標のキャラクターをクリア後、Old_coordinateは(手抜きの)初期化
キー入力部分の引数にOld_coordinateを追加して・・
しゃぁ!オラッ!狙ったとおりに動くようになったぜ!やったーっ!
いや〜今回は苦労したわ〜
次回はCarryの状態でTruckに接触したらAnimalをJailedにして・・とかそういうところを実装しよう。そろそろゲームになってきたぞ!
つづく