Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

RPG制作におけるアイテムの実装方法

RPGの創作をしているのですが、アイテムの実装をする良い方法が思いつきません。

プレイヤーインスタンス(HPや攻撃力といったプレイヤーの情報を格納しています)の中にインベントリ(持ち物)を作れるような実装方法を探しています。

練習用の剣や鋼鉄の鎧といったアイテム一つ一つにクラスファイルを用意してその中に値を定義するのが最善策なのでしょうか?
この方法だと値を定義するのは簡単で製作中も見やすいですが、プレイヤーインスタンスにインベントリを生成する(アイテムの所持状況を記録する)方法がわかりません。

インベントリの実装はMapを利用してアイテムIDをキーとし、その所持数を値として格納しようと考えています。が、IDをアイテムデータに結びつける方法がわかりません。

何か良い実装方法は無いのでしょうか。知恵をお貸しください。

10

回答

5488

閲覧

10件の回答

評価

0

>IDをアイテムデータに結びつける方法がわかりません。
この「ID」はその前に出てきている「アイテムID」のことなのか?
「アイテムID」は何を意味するものだ?

普通こういったシステムでは、アイテムには複数のIDが付与される。
通し番号としてのID、道具のカテゴリー(剣とか鎧とか)を示すID、そしてカテゴリー内の種類を示すIDなどなど。
多くはカテゴリーごとのクラスになるだろう。

アイテムデータは、例えば耐久度や固有名のことだろうか。

たとえば
class Sword extends Item
class Armor extends Item
のようなクラス群に対してList<Item>を持つことが考えられる。
所持数が何万何十万になることはあり得ないので、個々の所持数はその都度調べればいい。
(今のMapと二つ持ってもいいが、二重管理は関心しない)
頭、腕、胴といった部分にアイテムのインスタンスを割り当てることで、「装備」と見なす。

またアイテムデータは、普段ステータスを表示するのに必要な分だけをメモリ上に展開し、
詳細を見る画面でだけ表示するデータはDBで管理するというのも考えられる。

評価

0

質問者です。
ご回答ありがとうございます。
質問内容の不備について、申し訳ありません。ご回答から推測するに汲み取って頂けてるとは思いますが、念のため補足させて頂きます。
---------------補足ココカラ
>この「ID」はその前に出てきている「アイテムID」のことなのか?
>「アイテムID」は何を意味するものだ?
はい。「ID」=「アイテムID」です。
アイテムIDは練習用の剣、普通の剣といったアイテム群に1、2といった通し番号を割り当てた時の番号のことを考えていました。

>アイテムデータは、例えば耐久度や固有名のことだろうか。
はい。固有名やアイテムの持つ能力、フレイバーテキストなどのことです。
---------------補足ココマデ

なるほど。剣や鎧、回復薬といったカテゴリー毎にクラスを作り、そこにコレクションを作るのですね。
となるとプレイヤーインスタンスにインベントリを作成するのは諦めてアイテムデータに所持数情報を管理させるべきなのでしょうか?

DBについてはまだ学んでいないのでわかりませんが、負荷を減らすためにもそういった管理方法の使い分けをするべきなのですね。

評価

0

頼りになるかはわかりませんが、私がゲーム作成のときに参考にしているサイトはここです。
http://aidiary.hatenablog.com/entry/20040918/1251373370

評価

0

質問者です、ご回答ありがとうございます。
おお!参考にさせて頂きます、ありがとうございます!

評価

0

質問者です。
最終的には
class Sword extends Itemなどに対して
プレイヤーインスタンスにList<Item>を生成することにしました。
(最初の回答者様の意図を最初はしっかり理解していませんでした、申し訳ありません)

アイテムの追加方法はSwordクラス等にコンストラクタ(Sword(String name,String comment,int 
prize,int Atk)など)を作り、アイテム入手イベントが発生する度にそれを使って変数Sword等をnewしてadd(Item)でList<Item>に追加する・・・といった具合です。

お二人様、ありがとうございました。

評価

0

コンストラクタで渡すのは、そのクラスを構成する最低限の属性で良い。
optionalな属性はsetterで与える(自分しか使わない前提なら、publicなフィールドに直接設定でも良いが)。
作りこんでから属性を追加したくなったら、コンストラクタ渡しは厄介だ。

評価

0

質問者です。お世話になっております。
>>optionalな属性はsetterで与える
Optionalな属性とは、どういった属性のこと何でしょうか?検索すると「任意の」等とでましたが、
任意な属性というのは良くわかりません。ご教授頂けないでしょうか。
(念のため申し添えますが、ご回答を強要しているつもりは毛頭ありません。ご理解いただけているとは思いますが、ご回答なさりたく無ければスルーして頂いて結構です。念のため)

評価

0

例えば、剣は名無しの剣もあるだろう。
名前を与えるのは任意ということだ。

評価

0

質問者です。ご回答ありがとうございます
なるほど。つまり、必ずしも設定を強制しない属性のことを指すのですね。
例えば薬草の回復値はコンストラクタで渡して(回復しない薬草は無いので)
剣を一本鍛える毎にランダムでその剣に追加されるボーナス攻撃力はsetterで与える(ボーナス攻撃力が無い剣もあり得る)・・・といった具合の認識で良いのでしょうか。

評価

0

そんなところ。
まあ、これは別にゲームに限った話じゃないがね。
属性の数が少なければ全部コンストラクタだっていいんだが。

ただ、ゲームのアイテムなんかはシステム拡張や変更で属性がどんどん増えるだろう。それを全部コンストラクタ渡しにするのは、コードが見づらくなるだけだ。
(newする箇所が複数あったら全部に手を加えることになるし)
最低限の追加で済む形にしておく方がいい。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。