体力をハートマークで表示する・その3
妹「もしゼルダみたいにハートが1/4ずつ減らせるようにしようとしたらどうなるの? HPを0.25ずつ減らすの?」
「そうじゃなくて、HPの計算を4倍にする。最大HPと、くらうダメージと。10段階あるんだったら同じように10倍する。とにかく1が最小の単位になるように調節する。ステータスとかで数字を出す時は小数にしてもいいんだけど、内部データとしては整数が良い。HPとかだと計算誤差が文字通りに命取りになることがあるから」
妹「今HPはFloatになってるんだけど……」
「そうなの? 整数の足し算と引き算しかしてないんだったら、誤差は出ないから問題はないと思うけど。ともかく1が最小単位と決まれば、ハート1個減るレベルの攻撃では4を引くとか、そうやって調整することで計算上の問題はなくなる」
妹「表示の仕組みは? 同じように比較したらハート表示されすぎになるし、4で割っても端っこの1つの表示が変になるような」
「やり方は色々あると思うんだけど、取り合えず計算用のHPを用意する方法で作ってみた。ハートが欠けてる絵は用意してないから、代わりにウィジェットにテキストを追加して、欠けてる時は1/4とか上に出てくるようにした」
「計算用HPは、ループの前に現在HPを入れておいて、ハートを1つ進めていくたびに4ずつ減らしていく。そうすると欠けてる部分のハートのとこまでに来ると1とか2とかの端数が出るから、その時に欠けた用に表示すればいい。最後まで0と4以上しか無ければ欠けてないってこと。ArrayIndex*4から現在HPを引いて、差が1~3の間よりなら欠けてると判断してものいいけど、式が違うだけでやることは同じことだね」
妹「たいぶ複雑になったような」
「計算用HPを追加してあるのと、欠けた時用のラベル表示のノードが増えてるだけだよ。ラベル表示のとこを絵と差し替えるなら、SelectでじゃなくてSwitchにして、数字に応じて別の絵が出るようにすればいい」