体力をハートマークで表示する・その2
「昨日の続きの、どういう仕組みで表示を切り替えるかって話なんだけど、HPが1の時はハート1がTrueで、ハート2がFalseでって、全部分岐作ってもいいけど原始的すぎる。基本的には計算で、HPの上限が増えたりしても対応出来るようなブループリントにしたい……ところで、このハートって配列とかに入ってるのかな?」
妹「配列ではないよ。ハートだけのウィジェットがあって、それをいっぱい作ってUniformGridPanelの中に入れてるだけだから」
「UniformGridPanelの方で中身を配列としてアクセス出来る機能があっても良さそうなものだけど……見つからないものは仕方がない。どういう計算でやるにしても、ハートのウィジェットに数字でアクセス出来るようにしないといけない。最初に配列を作っておくか、Selectノードを使うか」
妹「ConstructScriptで配列作ったけど、これでいい?」
「良さそう。それでハートの表示だけど、減ったり増えたりしたハートを探して、そこだけ変更するのではなくて、HPが変わるたびに全部のハートで計算するのがおすすめ。どうせステージの最初とかでハート表示を全部調整するプログラムは作るわけだから、それ1個で全部やった方が簡単」
妹「それだとどう考えても関係なさそうなハートのとこも、いちいち計算し直すんだよね? 面倒じゃないの?」
「もちろん人間がやるんだったら、一回ホワイトボードから全部マグネットを外してから付け直すとか、そんなことはしないんだけどね。でも作業はコンピューターがやるから、作業より命令の方を簡単にする方がいい。難しい数式とか使うんだったら別だけど」
妹「簡単なのはいいけど、具体的にはどういう仕組みに?」
「ウィジェットの配列化は出来てるから、それをForeachのループで回す。そしてループ中のIndexの値と現在のHPを比較して、HPと同じかHPの方が多かったら中身の詰まったハートと、そうでない場合は空っぽのハートの表示する」
妹「ループ中の値とHPを比較……えーと、うーん、なんか考えてもよくわからない……」
「そういう時は紙に書いてみるといいよ。配列とHPとで数字の始まりが違うこともあるし。HPは2とか3とかに簡素化して。作ってみて思ったのと違う時は、途中式とかフラグをPurintStringで出して、想定とのズレを調べる」
妹「えーと、最大HPが少ない時に、持ってないハートを見えなくするのは……HPじゃなくて最大HPで比較すればそういう風になるか……こんな感じで出来そう」
「ちゃんとゲージ減ってるね」
妹「HPが変わった時だけカスタムイベントで呼び出すつもりだったけど、とりあえずティックにしたら動いたから、このままでもいいかなあと」
「カスタムイベントでやるんだったら、HP変更を関数にして、その関数でイベントを呼び出すようにすれば更新漏れが起きにくくなる」
妹「あとここまで作っておいてなんだけど、やっぱりゲージ式の方がいいかなあとか」
「ゲージも細長い四角をいっぱいくっつける形式だったら絵の差し替えるだけでも作れるよ。スプライトを引き延ばすタイプとか、減った分を黒スプライトで隠す方式とかだと、もう少し違ってくるけど、考えていく手順はだいたい同じ」