Come creare un sistema di inventario da giocatore a mondo?


11

Sto incontrando il problema di provare a implementare un sistema di inventario all'interno di XNA (non importa, potrebbe essere qualsiasi piattaforma) ma finora. Ecco il problema che sto cercando di avvolgere la testa:

Come posso ottenere un oggetto dal mondo (pensi quando uccidi un mostro che fa cadere l'armatura) e inserirlo nell'inventario del mio giocatore?

Se un inventario è solo un elenco di oggetti, tecnicamente, come posso ottenere Steel Sword dal mondo nell'inventario del mio giocatore senza che una classe faccia più di una cosa?

Al momento ho una struttura di oggetti, che contiene un valore esadecimale univoco, un conteggio di quanti oggetti ci sono (per gli stackable, come le frecce) e una Texture per il rendering all'interno dell'inventario e alcune altre proprietà non importanti (nome, descrizione, ecc.) .

Sarebbe un cattivo progetto se dovessi modificare la mia classe di oggetti esistente per ospitare una posizione mondiale, insieme al rilevamento delle collisioni (non voglio che l'oggetto cada attraverso la terra).

Grazie per qualsiasi considerazione!


4
Non puoi semplicemente avere un WorldItemche è separato dal tuo InventoryItem? (Forse WorldItemha un InventoryItemmodello che viene inserito nell'inventario del giocatore quando viene raccolto).
George Duckett,

1
@GeorgeDuckett Dovresti fare in modo che questa sia una risposta .. Probabilmente dovrebbe esserci un metodo nel Inventoryche prende un WorldIteme lo aggiunge come InventoryItem. In modo che potesse anche gestire i casi in cui gli oggetti devono essere impilati (es. Frecce).
Bummzack,

@bummzack: Fatto.
George Duckett,

Risposte:


17

L'approccio che vorrei seguire è di avere 2 diverse strutture (o classi). WorldIteme InventoryItem.

Puoi quindi aggiungere un InventoryItemcome proprietà / campo del tuo WorldItemche è ciò che viene inserito nell'inventario del giocatore quando l'oggetto del mondo viene raccolto.

Vorresti un metodo da qualche parte (sulla classe del giocatore, o su entrambe le classi di oggetti) che gestisca l'aggiunta di un oggetto di inventario all'inventario del giocatore, per gestire l'accatastamento come oggetti.


Mi piace molto questa risposta, grazie mille, ha molto senso! Un ultimo pensiero, supponiamo che la persona voglia rilasciare un oggetto, anche l'articolo Inventario avrebbe bisogno di un WorldItem al suo interno?
Ross,

Se deve essere in 2 modi, sarei tentato di avere una classe di "ricerca" separata che memorizzava coppie di oggetti del mondo e oggetti di inventario. Lo useresti per cercarne uno, visto l'altro.
George Duckett,

Ohhh carino, non ci ho mai pensato. Questa è un'idea molto interessante. Dal momento che tutti gli articoli sono concreti, ha senso cercarli.
Ross,

2
Distruggerei il WorldItem quando veniva raccolto e ne creavo uno nuovo quando l'oggetto veniva lasciato cadere.
Simon Richter,

Concordato. Non intendevo implicare diversamente.
George Duckett,

0

Come accennato prima di suddividere in più classi o array sarebbe la soluzione migliore. Creerei 3 classi, Mondo, Giocatore e Oggetto La classe mondiale avrebbe un Elenco di oggetti del mondo, così come la classe Giocatore, ma denominata Elenco inventario Quando un giocatore prende un oggetto, lo sposti dall'elenco nel Mondo classe all'elenco nella classe Player.

Nel loop di disegno del tuo gioco potresti creare un loop che disegna sullo schermo tutti gli oggetti nell'elenco WorldItems, ma ovviamente ignora l'elenco di inventario sull'oggetto giocatore.


Il mio metodo attuale in questo momento è che ho una classe WorldItem che incapsula un InventoryItem, entrambi appartenenti allo stesso oggetto. Nel metodo di aggiornamento del gioco cerco tutti gli oggetti del mondo e metto alla prova i confini delle collisioni con il giocatore. Se i due si scontrano, WorldItem viene rimosso dall'elenco WorldItem e viene inserito nell'inventario del giocatore (che è un Elenco <> di InventoryItem)
Ross
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.