JavaゲームのようにRPGでアイテムを定義するにはどうすればよいですか?


21

私は何気なくJavaでRPGタイプのゲームに取り組んでいますが、アイテムごとに異なるクラスを作成せずに、さまざまなことを実行できるアイテムをどのように持つことができるかを理解するのに苦労しています。

例として、木を切り刻んでモンスターを攻撃できるxを作成するにはどうすればよいですか?

チョッピングまたは武器クラスのいずれかを拡張すると、他のクラスを拡張できません。

チョッピングがあり、武器がインターフェイスである場合、短剣がモンスターを攻撃し、別のaが木を切ることができるときに、多くの重複したコードがあります。

単一のItemクラスを持ち、ファイルからアイテムとそれぞれの機能をロードする方法があることを望んでいます。それが可能な場合、どうすればできますか?そうでない場合、ゲームにアイテムを入れる最良の方法は何ですか?

回答:


15

グレゴリーウィアーの答えは、複数の役割を実行するためにアイテムインスタンスを構成する方法に関する私のお気に入りです。

ファイルからロードするには:

まず、YAMLを使用します。YAMLは機能的なデータ記述言語です。比較的迅速に解析、人間による読み取りと編集、バイナリデータのサポート、Javaを含むほとんどのプログラミング言語のライブラリが存在します。これにより、「ファイルからオブジェクトにデータを取得する方法」が解決されます。

次に、フライウェイトパターンを使用しますこれらのファイルから読み取るデータのほとんどは静的です。インスタンスごとに変化することはありません(「軸は1d10の基本ダメージを与え、木材を破壊しますが、石は破壊しません」-プレイヤーが持っている5つの軸すべてに当てはまります)。YAMLファイルから実際に読み取るのは、これらのプラトニックな定義であり、個々のアイテムインスタンスは、「ブレーク前のスイング数」、「プレーヤーから与えられた」カスタム名ですか?」など。

単一のオブジェクトでインスタンス間データを共有することにより、多くのメモリを保持し、ゲームの状態を保持せずにアイテムを簡単に更新できます(ゲームまたはプレイヤーデータベースを保存します)。

したがって、クラス構造は次のようになります。

  • クラスItem-アイテムごとに1つのインスタンス
    • Owns-a Weaponインスタンス
    • Owns-a Toolインスタンス
    • Has-aカスタム名など
  • クラス武器-(最大)アイテムごとに1つのインスタンス
    • Is-a ItemComponent
    • 参照先WeaponDef
    • Has-aボーナスエンチャントレベルなど
  • クラスツール-(最大)アイテムごとに1つのインスタンス
    • Is-a ItemComponent
    • 参照先ToolDef
    • Has-a耐久性など
  • クラスWeaponDef-武器の種類ごとに1つのインスタンス
    • ファイルから読み取る場合、フィールドは定数でなければなりません。
    • Has-a基本ダメージ量、1または2ハンドなど
  • クラスToolDef-ツールの種類ごとに1つのインスタンス
    • ファイルから読み取る場合、フィールドは定数でなければなりません。
    • 基本的な耐久性、破損する可能性のある材料など

18

コンポーネント(複合ではない)デザインパターンは、この目的に最適です:http : //gameprogrammingpatterns.com/component.html

基本的に、AxeはWeaponComponentとToolComponent(おそらく)を含むItemクラスのインスタンスです。武器として使用できるものがあるかどうかをテストするには、WeaponComponentがアタッチされているかどうかを確認し、そのWeaponComponentインスタンスと通信してアイテムの武器情報を取得します。

もちろん、ファイルからの読み込みは別の演習です。


そしてもちろん、コンポーネントを作成したら、再びインターフェースを活用できます。AxタイプはIChopperとIWeaponを実装できますが、コンポーネントの動作を公開して、必要に応じてタイプと実装の両方を再利用し、コンポーネントのテストを切り捨てることができます。すべての軸に同じ機能がありますが、統計値が異なる場合、あなたは最高です。アイテムに固有の機能を持たせる必要がある場合は、game-component-collectionを実装し、更新ルーチンにオブジェクトを照会して、存在するコンポーネントを介して何ができるかを問い合わせる必要があります。
CodexArcanum

6
@CodexArcanum:「あなたのAxタイプはIChopperとIWeaponを実装できますが、コンポーネントの動作を公開できます」-これのポイントは何ですか?クラス階層が膨張します。コンポーネントパターンのポイントは、AxeクラスまたはIChopperインターフェースまたはIWeaponインターフェースは必要なく、具体的なChopperおよびWeaponコンポーネント、および最上位のItemだけであるということです。

私は現在、自分のゲームアイテムのコンポーネントシステムに取り組んでいますが、実際にはパターンの使用方法について大きな不満が1つだけあります。武器、アパレル、および消耗品のコンポーネントを考えると、武器とアパレルの両方、または消耗品でもあるアパレルにはできないアイテムに関して、アイテムは理論的に「破損」する可能性があります。論理的には、アイテムは1つの「主要コンポーネント」にしかなれませんが、コンポーネントを制限することにより、コンポーネントシステムの必要性をすべて壊すことになります。したがって、それ以外の点では驚くべきシステムの根本的な欠陥の1つ
Krythic
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.