Comment créer un système d'inventaire du monde au joueur?


11

Je rencontre un problème d'essayer de mettre en œuvre un système d'inventaire dans XNA (cela n'a pas vraiment d'importance, pourrait être n'importe quelle plate-forme) mais jusqu'à présent. Voici le problème que j'essaie de comprendre:

Comment puis-je obtenir un objet du monde (pensez que lorsque vous tuez un monstre, il laisse tomber une armure) et le mettre dans l'inventaire de mon joueur?

Si un inventaire n'est qu'une liste d'objets, techniquement, comment pourrais-je faire entrer Steel Sword du monde dans l'inventaire de mon joueur sans qu'une classe fasse plus d'une chose?

J'ai actuellement une structure d'élément, qui contient une valeur hexadécimale unique, un décompte du nombre d'éléments (pour les empilables, comme des flèches) et une texture pour le rendu dans l'inventaire, et quelques autres propriétés sans importance (nom, description, etc.) .

Ce serait une mauvaise conception si je devais modifier ma classe d'objets existante pour abriter une position mondiale, ainsi que la détection de collision (je ne veux pas que l'article tombe à travers la terre).

Merci pour toute considération!


4
Ne pouvez-vous pas simplement en avoir un WorldItemqui est séparé du vôtre InventoryItem? (Peut-être WorldItema-t-il un InventoryItemmodèle qui est mis dans l'inventaire du joueur lorsqu'il est ramassé).
George Duckett

1
@GeorgeDuckett Vous devriez en faire une réponse .. il devrait probablement y avoir une méthode dans le Inventoryqui prend un WorldItemet l'ajoute comme InventoryItem. Pour qu'il puisse également gérer les cas où les éléments doivent être empilés (par exemple, les flèches).
bummzack

@bummzack: Terminé.
George Duckett

Réponses:


17

L'approche que j'opterais serait d'avoir 2 structures (ou classes) différentes. WorldItemet InventoryItem.

Vous pouvez ensuite ajouter un en InventoryItemtant que propriété / champ de WorldItemce qui est placé dans l'inventaire du joueur lorsque l'objet mondial est ramassé.

Vous voudriez une méthode quelque part (sur la classe de joueur, ou l'une des classes d'objets) qui gère l'ajout d'un élément d'inventaire à l'inventaire du joueur, pour gérer l'empilement comme des objets.


J'aime vraiment cette réponse, merci beaucoup, elle est tellement logique! Une dernière pensée, disons que la personne veut déposer un article, l'article d'inventaire aurait-il également besoin d'un WorldItem?
Ross

Si cela devait être à 2 sens, je serais tenté d'avoir une classe de «recherche» distincte qui stockerait des paires d'objets du monde et des objets d'inventaire. Vous utiliseriez ensuite cela pour rechercher l'un, compte tenu de l'autre.
George Duckett

Ohhh bien, je n'ai jamais pensé à ça. C'est une idée très intéressante. Étant donné que tous les éléments sont concrets, il est logique de les rechercher.
Ross

2
Je détruirais le WorldItem lorsqu'il serait récupéré et j'en créerais un nouveau lorsque l'objet serait déposé.
Simon Richter

D'accord. Ne voulait pas impliquer le contraire.
George Duckett

0

Comme mentionné précédemment, la division en plusieurs classes ou tableaux serait votre meilleur pari. Je créerais 3 classes, Monde, Joueur et Objet. La classe mondiale aurait un List WorldItems, ainsi que la classe Player, mais nommée Inventaire. Lorsqu'un joueur prend un objet, vous le déplacez de la liste dans le Monde. à la liste de la classe Player.

Dans la boucle de tirage de votre jeu, vous pouvez faire une boucle qui dessine tous les éléments de la liste WorldItems à l'écran, mais ignore bien sûr la liste d'inventaire sur l'objet joueur.


Ma méthode actuelle est que j'ai une classe WorldItem qui encapsule un InventoryItem, tous deux appartenant au même élément. Dans la méthode de mise à jour du jeu, je passe en revue tous les objets du monde et teste les limites de collision avec le joueur. Si les deux entrent en collision, le WorldItem est supprimé de la liste WorldItem et est mis dans l'inventaire du joueur (qui est une liste <> de InventoryItem)
Ross
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.