前回から大分期間が空いてしまいましたが、こんばんは。


詰まっていたアイテムも、どうにか仕様が固まったので、その過程を晒して見たいと思います。


本来、アイテムのように「一度設定したパラメータが変化しない」ようなデータは、オブジェクトをコピーするのではなく間接的に参照した方が効率が良いです。(対して、戦闘時にHPが変化する敵は、オブジェクトのcloneが出来た方が良いと思います。同種の敵が同時に二匹出現したとき、HPの値を共有していては困りますからね。)





一つ目の分岐点となったのは「使用アイテムと装備アイテムのクラスを分けるか」という点でした。結論から言って、メモリ量節約のため私はクラスを分けたのですが、ここで分けなかった場合は数キロバイトのメモリを無駄にする反面、いくつかの問題は解消していたと思います。





さて、私は装備アイテムを使用アイテムの子クラスにし、所持アイテムを親クラスの参照変数配列で表現することにしました。しばらく平穏に過ぎましたが、次の問題「セーブ」に思い当たりました。セーブ時には持っているアイテムを数字で管理できることが望ましいので、私は参照の方法を参照変数の配列からint配列に変更しました。





ここでクラスの分割が裏目に出ます。単なる整数では、普通のアイテムの配列と装備アイテムの配列のどちらを参照していいか分かりません。単純に連結したのでは、普通のアイテムのデータ数によって装備アイテムの添え字が変わってしまいます。





ここで、二つの考えが思いつきました。一つは、両方を同一の配列に突っ込み、定義ファイルでは使用アイテムと装備アイテムが混在することを許すという方法です。もう一方は、あらかじめ使用アイテムのデータ数の限界値を決め、装備アイテムを表す値はその数値に添え字を足すという方法です。アイテムを表す数字が限界値以上だったらその数値を引いて装備アイテムとみなすということになります。





前者の方が実装が楽そうで「スマート」に見えましたが、結局私は後者を採用しました。前者にするならば、そもそもクラスを分けたメリットが余り発揮されないことと、後者は型変換が必要ないことが主な理由です。


どちらが優れているかはまだ答えは出ていませんが、逆の方が優れていたらすぐにでも移行しようとは考えています。