では、とりあえず現在まで書いてるコードをちょっと添削してもらおう。
ハイフンは使ってはいけないという・・お作法なんだろうけど、まあ書式を統一しておくのは有効なので、今後は他の言語でもRustのお作法に従った命名を心がけよう。
各方向を向いた時のShapeを保存する構造体。これは動物にも使えるので・・なんかオブジェクト指向っぽい。[が足らんかった・・あと、命名規則。
Main内でPlayerのインスタンスを定義。なんとなく必要かなぁ・・と思って書いたけど、これが大正解だった。
間違ってたのは例によって命名規則。そしてResult型のErr時の返り値、これは後で調べることにする
ここは命名規則だけNG。各フィールドは,で区切るけど、最後は,がいらない(Matchと違って)ってのは覚えておこうか。
そう言えばカラーのフィールドも持たせないといけなかった・・しかし、型は何になるのか?
あ、Colorなのか。分かりやすい!
さて、いよいよDisplay関数を書いていこう。前回はまず全部CLIで動くところまでやってたけど、今回はすぐさま本番の画面を表示する事で実際に必要な処理なんかを考えていかないといかんので。
狙いとしては・・Char要素1つにつき、それぞれ2x2に拡大した表示スペースを用意して、オブジェクトが持っている2x2のCharキャラ(Player.dis
)を配置していくと。
その際に、一旦マップとキャラクターを合成した合成Charマップを作って、それを入れ子Forで表示するのか、それともマップとキャラを別で操作しても重ね合わせの表示が成り立つのか?って話。もしレイヤー構造を取れるんだったらこれは相当に便利だぞ!と。下にキャラを表示、上からマップを表示すれば動物が森の中を不可視で移動する表現がラクラク出来る!
出来るんかーい!やったぜ!と言うか、僕のあのややこしい説明を完璧に理解してるのが恐ろしい・・(・_・;)
Crossterm最高
あまりにもありがたかったので、今日はまだ途中だけど感謝の言葉を述べてみる。
で、頼みもしないのに実装例を示してくれるClaude先生。あ、でもこれはカンニングすべき。自分では思いつかなかったであろう。
まず、2x2の起点となる点を決めるわけだけど、自分の中ではもっと複雑な式をぼんやりと考えていたのだが・・エレガントすぎるだろ!
そして、実際の表示部分はForとか使わないんだな・・。まあ、分かりやすいけど。
続いてPlayer表示部分。こっちは座標のデータを個別で持ってるので単純に*2にすれば起点を取れるのがシンプルで良いね!
で、実際の表示には現在向いてる方向のキャラの姿が必要になるのだけど、なんとなく設定しておいたdirectとshapeから表示方法を勝手に考えてくれるClaude先生。おおお・・なるほどこうやって使うのか・・!特にshapeの[0][0]~[1][1]のところに感動した。
このDisplay関数で一気に理解が進んだわ〜(過去の自分比)。
一応最低限の材料は揃ったので早速テスト。いくつかのエラーを直して・・ところで、上の画像「今後の実装のために」と思ってCharacterShapeにくっつけてたDeriveのPartialEqが実際には使われてないのでエラーとされてしまった模様。厳密すぎる!
Display関数はこんな感じで
Mainの新規記述部分はこんな感じで・・・
出たーっ!明らかに銃を持ったハンターが右を向いてる。
ま・・もともと縦長のゲーム画面ってのが更に引き伸ばされて異様な感じになっているが。思い切って3x2にすべきかなぁ?
ところで、キャラを下に置いて上にマップを被せることで森の中の動物を更かしに出来るのか?というのをチェックしてみよう
うーん、厳しいなw まあ、動物の表示条件で参照マップ1と同じ座標の場合は表示しないようにすれば良いのだけど
というわけで、今日は目標達成。実に気分が良い!
明日は早速キャラを動かしてみるか?