星田オステオパシー

Rustでトランキライザーガン その04 影分身破れたり

 次に行く前に気になってるResult型のBox<dyn Error>について質問してみる。要はさまざまな種類のエラーをひっくるめて扱えるらしい。とりあえずこれにしておけば間違いないってところか?

 はぁ〜・・Enumでエラーのタイプを関連付けた自作のエラーも定義できるのか。まあ、そこまでやる気ないけど


 エラー情報は失われるとか書いてたけど、取り出すことは出来るのか。今のところ、そんなところまで必要になるか分からないけど、そういうことが出来るってことはちょっと覚えておきたいところ

 画面表示があんまりにも縦長だったので、思いきって3x2のキャラ表示に変更することにした。考えてみれば、各キャラクターの表現力も上がるわけだし


 じゃあいよいよキー入力部分に入っていくか!まずはトランキライザーガンは4方向に移動と射撃が出来るので、向きが変えられないと始まらない。方向キーを検知して、Playerインスタンスのdirectフィールドを変更する


 その際に、Playerインスタンスが可変である必要があると。確かにmutつけてなかった


 迷路ゲームからパクって来た上のパターンではPlayer.direct=のあとにMatchを入れて改変してるので、何もしない場合には何かを入れないといけないのでCloneがいるけど、この例みたいにすれば期待してないキーの場合は「何もしない」で済ませられるのでスマートだな・・一応覚えておく努力はしよう


 プレイヤーの操作としては、あと「現在の方向に進む」のと「麻酔銃を打つ」というアクションがあるのだが・・とりあえずEnterとSpaceを割り当てるか。
 迷路ゲームからパクってきたパターンの場合、改変されるのはPlayer.directなので、キー判定を別に書かないといけないのだが・・


 向いてる方向に一歩進むというメソッドを書く。うーん、こんな感じ?

 こちらが添削版。あ、そっか・・まずはMutにしてないと変更が出来ないだろと。それと改変型メソッドの場合はSelfを返さないで良いんだった。

 まとめるとこういう感じ。数値がマイナスにならないための減算メソッドがSaturating_subってことか


 Claude先生からのより安全なコードの提案。まるっきり真似はしないけど、いずれ同じような処理を書かないといけないので構造は覚えておこう。Playerのメソッドとして判定を作っておくわけか・・

 ところで、上の提案されたコードで気になるのがGo_forawadの返り値がBoolになってるところ。なんか呼び出す側とかも書き換えたりして面倒になるんじゃないのか?と。
 解説を読むと・・そうなんか?という印象。なんかFalseが返ってくる事で厄介事が起きる気がするけどなぁ・・ま、いいや。そのうち直面する問題だし。


 というわけで、自作と添削の結果をあらためて見比べる。基本的なところは間違ってないので良しとしよう

  出来ればプレイヤーの向きを変えるイベントと一緒にしたほうが良いかと思ったけど面倒だったので向きを変えたあとにEnterで前進、Spaceで射撃・・とするべく書いてみる。Matchの前に=での変更入力をせずにアームの先でそれぞれ実行するので、_ =>の先はCloneでなくても良いわけか。
 笑ったのは上の自作でのgo_forawad、どうしても無意識で関数的な書き方をしてしまうのだった

 そうそう、これが分かってなかったんだなぁ〜・・何しろ迷路ゲームのコピペだったから。では、実際にプレイヤーを動かしてみよう!



 な、何ぃ!?これは忍法影分身!
 参ったなぁ・・更にやばそうなのは画像ではわからないけど、やたらとキーレスポンスが悪いこと。何度もキーを押さないと方向転換も移動も反応しないのだった。


 もしかしてDurationの待ち時間が長すぎるのか?と100だったのを10にしてみる。が、結果は同じ。

 と、ここで昼間は時間切れ。バイトの風呂掃除をしながら「もしや・・」と思い当たる。それは当然だけどキー入力を複数並列で行ってるところ。あれを一本化してないからなんじゃないか?と。

 Matchのアーム内にに条件式を入れる書き方をClaude先生に教わって・・

 こいつでどうだ?おそらくこれでキー入力の不具合は改善できるはず。
 続いて、影分身問題。これも考えてみれば当たり前で、移動後に以前の表示を消した覚えがないんだもの。迷路ゲームの場合は毎フレーム全クリアしてるから良かったけど、今回のは変更部分のみ書き換えるわけで、そこんところをなんとかしないと。


 最初はDisplay関数に書こうと思ったが(PrintはPrintに行わせるべきなので)・・考えてみたら、Displayに書いてしまうと移動しなくても古い座標を消すことになってしまうのでまずい気がする・・というわけで、不本意ではあるけどもGo_forwardメソッドの中に移動前に現在の座標にある表示を消すように書くことにする。こうすればGo_forwardが実行されるまでは消えないので問題は無いはず・・

 というわけで・・無事に影分身は消え去り、キーレスポンスも快適になった!やったぜ!
 あ、それから移動に関しては方向キーを入れたときに、別の方向を向いてるときには方向転換。すでに同じ方向を向いてるときにはGo_forwardするようにしました。やっぱりこっちが自然だなw

 次回は麻酔銃の発射に挑戦してみるかな〜
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事