ワールドツープレイヤーインベントリシステムを作成する方法は?


11

XNA内に在庫システムを実装しようとする問題に直面しています(実際には問題ではなく、どのプラットフォームでもかまいません)。ここに私が頭を抱えようとしている問題があります:

どのようにして世界からアイテムを入手し(あなたがモンスターを殺すと鎧を落とすと思います)、それを私のプレイヤーのインベントリに入れることができますか?

インベントリが単なるアイテムのリストである場合、技術的には、クラスに複数の処理を行わせずに、世界からスチールソードをプレイヤーのインベントリに入れるにはどうすればよいですか?

私は現在、一意の16進数値、そこにあるアイテムの数(積み重ね可能、矢印など)、インベントリ内のレンダリング用のテクスチャ、およびその他の重要でないプロパティ(名前、説明など)を含むアイテム構造体を持っています。

既存のアイテムクラスを変更して、ワールドポジションと衝突検出(アイテムが地球を通り抜けてほしくない)を格納する必要がある場合は、設計が悪いでしょう。

考慮事項をありがとう!


4
あなたはあなたと別のものを持っているWorldItemことはできませんInventoryItemか?(たぶん、ピックアップしたときにプレイヤーのインベントリに入れられるテンプレートWorldItemがあるでしょうInventoryItem)。
George Duckett、2012年

1
@GeorgeDuckettあなたはこの答えにする必要があります。..多分にあるいくつかの方法があるはずInventoryかかるWorldItemとして、それを追加しますInventoryItem。そのため、アイテムをスタックする必要がある場合(矢印など)も処理できます。
bummzack

@bummzack:完了。
George Duckett、2012年

回答:


17

私が行くアプローチは、2つの異なる構造体(またはクラス)を持つことです。WorldItemおよびInventoryItem

次にInventoryItem、のプロパティ/フィールドとしてを追加できます。WorldItemこれは、ワールドアイテムがピックアップされたときにプレーヤーのインベントリに配置されるものです。

プレイヤーのインベントリへのインベントリアイテムの追加を処理するような(プレイヤークラスまたはいずれかのアイテムクラスの)どこかにメソッドを置き、アイテムのスタックを処理する必要があります。


私は本当にこの答えが好きです、ありがとう、それはとても理にかなっています!最後に1つ考えてみましょう。たとえば、その人がアイテムをドロップしたい場合、インベントリアイテムにもWorldItemが必要ですか?
ロス・

2方向にする必要がある場合、ワールドアイテムとインベントリアイテムのペアを格納する個別の「ルックアップ」クラスを作成したくなるでしょう。次に、それを使用して、もう一方を指定して一方を検索します。
George Duckett 2012年

ああいい、それについては考えたことがない。それは非常に興味深いアイデアです。すべてのアイテムは具体的であるため、それらを検索することは理にかなっています。
ロス

2
WorldItemがピックアップされたときに破棄し、アイテムがドロップされたときに新しいWorldItemを作成します。
Simon Richter、2012年

同意した。そうでないことを意味するつもりはなかった。
George Duckett 2012年

0

前述のように、複数のクラスまたは配列に分割するのが最善の策です。World、Player、Itemの3つのクラスを作成します。WorldクラスにはList WorldItemsが含まれ、PlayerクラスにもList Inventoryという名前が付けられます。クラスをPlayerクラスのリストに追加します。

ゲームの描画ループでは、WorldItemsリストのすべての項目を画面に描画するループを作成できますが、もちろん、プレーヤーオブジェクトのInventoryリストは無視されます。


現在の私の方法は、同じアイテムに関係するInventoryItemをカプセル化するWorldItemクラスがあることです。ゲームのUpdateメソッドでは、すべてのワールドアイテムを循環させ、プレーヤーとの衝突境界をテストします。2つが衝突した場合、WorldItemはWorldItemリストから削除され、プレーヤーのインベントリ(InventoryItemのList <>)に入れられます
Ross
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.