Wie erstelle ich ein World-to-Player-Inventarsystem?

11

Ich habe das Problem, ein Inventarsystem in XNA zu implementieren (spielt keine Rolle, könnte jede Plattform sein), aber bisher. Hier ist das Problem, um das ich mich zu kümmern versuche:

Wie kann ich einen Gegenstand aus der Welt holen (denken Sie, wenn Sie ein Monster töten, lässt es die Rüstung fallen) und ihn in das Inventar meines Spielers aufnehmen?

Wenn ein Inventar technisch gesehen nur eine Liste von Gegenständen ist, wie könnte ich dann Stahlschwert aus der Welt in das Inventar meines Spielers aufnehmen, ohne dass eine Klasse mehr als eine Sache tut?

Ich habe derzeit eine Elementstruktur, die einen eindeutigen Hex-Wert, eine Anzahl der Elemente (für Stapelelemente wie Pfeile) und eine Textur zum Rendern im Inventar sowie einige andere unwichtige Eigenschaften (Name, Beschreibung usw.) enthält. .

Es wäre ein schlechtes Design, wenn ich meine vorhandene Gegenstandsklasse ändern müsste, um eine Weltposition zusammen mit der Kollisionserkennung aufzunehmen (ich möchte nicht, dass der Gegenstand durch die Erde fällt).

Vielen Dank für alle Überlegungen!

Ross
quelle
4
Kannst du nicht einfach eine haben, WorldItemdie von deiner getrennt ist InventoryItem? (Vielleicht WorldItemhat der eine InventoryItemVorlage, die beim Abholen in das Inventar des Spielers aufgenommen wird).
George Duckett
1
@ GeorgeDuckett Du solltest dies zu einer Antwort machen. Es sollte wahrscheinlich eine Methode in der geben Inventory, die a nimmt WorldItemund es als hinzufügt InventoryItem. Damit können auch Fälle behandelt werden, in denen Elemente gestapelt werden müssen (z. B. Pfeile).
Bummzack
@ Bummzack: Fertig.
George Duckett

Antworten:

17

Der Ansatz, den ich wählen würde, besteht darin, zwei verschiedene Strukturen (oder Klassen) zu haben. WorldItemund InventoryItem.

Sie können dann ein InventoryItemals Eigenschaft / Feld von Ihnen hinzufügen, WorldItemdas in das Inventar des Spielers aufgenommen wird, wenn der Weltgegenstand abgeholt wird.

Sie möchten irgendwo eine Methode (in der Spielerklasse oder in einer der Gegenstandsklassen), die das Hinzufügen eines Inventargegenstands zum Inventar des Spielers übernimmt, um das Stapeln wie Gegenstände zu behandeln.

George Duckett
quelle
Ich mag diese Antwort wirklich, vielen Dank, es macht so viel Sinn! Ein letzter Gedanke: Nehmen wir an, die Person möchte einen Gegenstand fallen lassen. Würde der Inventargegenstand auch ein WorldItem enthalten?
Ross
Wenn es in zwei Richtungen gehen muss, wäre ich versucht, eine separate 'Lookup'-Klasse zu haben, in der Paare von Weltgegenständen und Inventargegenständen gespeichert sind. Sie würden das dann verwenden, um das eine nach dem anderen zu suchen.
George Duckett
Ohhh schön, daran habe ich nie gedacht. Das ist eine sehr interessante Idee. Da alle Elemente konkret sind, ist es sinnvoll, nach ihnen zu suchen.
Ross
2
Ich würde das WorldItem zerstören, wenn es aufgenommen wird, und ein neues erstellen, wenn das Objekt fallen gelassen wird.
Simon Richter
Einverstanden. Wollte nicht anders implizieren.
George Duckett
0

Wie bereits erwähnt, ist die Aufteilung in mehrere Klassen oder Arrays die beste Wahl. Ich würde 3 Klassen erstellen, Welt, Spieler und Gegenstand. Die Weltklasse würde eine Liste WorldItems enthalten, ebenso wie die Player-Klasse, aber List Inventory. Wenn ein Spieler einen Gegenstand aufnimmt, verschieben Sie ihn aus der Liste in der Welt Klasse in die Liste in der Player-Klasse.

In der Draw-Schleife Ihres Spiels können Sie eine Schleife erstellen, in der alle Elemente in der WorldItems-Liste auf den Bildschirm gezeichnet werden. Die Inventarliste auf dem Spielerobjekt wird jedoch ignoriert.

Thomas
quelle
Meine derzeitige Methode ist, dass ich eine WorldItem-Klasse habe, die ein InventoryItem kapselt, die sich beide auf dasselbe Element beziehen. Bei der Update-Methode des Spiels gehe ich durch alle Weltgegenstände und teste die Kollisionsgrenzen mit dem Spieler. Wenn die beiden kollidieren, wird das WorldItem aus der WorldItem-Liste entfernt und in das Inventar des Spielers aufgenommen (dies ist eine Liste <> des InventoryItem)
Ross