Como criar um sistema de inventário de mundo para jogador?

11

Estou com um problema ao tentar implementar um sistema de inventário no XNA (realmente não importa, poderia ser qualquer plataforma), mas até agora. Aqui está o problema que estou tentando entender:

Como posso obter um item do mundo (pense que quando você mata um monstro ele solta armadura) e o coloca no inventário do meu jogador?

Se um inventário é apenas uma lista de itens, tecnicamente, como eu poderia colocar a Steel Sword do mundo no inventário do meu jogador sem que uma classe fizesse mais de uma coisa?

Atualmente, tenho uma estrutura de item, que contém um valor hexadecimal exclusivo, uma contagem de quantos itens existem (para empilháveis, como setas) e uma Textura para renderização dentro do inventário e algumas outras propriedades sem importância (nome, descrição, etc.) .

Seria um design ruim se eu tivesse que modificar minha classe de item existente para abrigar uma posição mundial, juntamente com a detecção de colisão (não quero que o item caia pela terra).

Obrigado por todas as considerações!

Ross
fonte
4
Você não pode simplesmente ter um WorldItemque é separado do seu InventoryItem? (Talvez ele WorldItemtenha um InventoryItemmodelo que é colocado no inventário do jogador quando coletado).
George Duckett
1
@ GeorgeDuckett Você deve responder a essa pergunta. Provavelmente, deve haver algum método no Inventoryqual pegue um WorldIteme o adicione como InventoryItem. Para que ele também possa lidar com casos em que os itens precisam ser empilhados (por exemplo, setas).
bummzack
@bummzack: Feito.
George Duckett

Respostas:

17

A abordagem que eu adotaria é ter 2 estruturas (ou classes) diferentes. WorldIteme InventoryItem.

Você pode então adicionar um InventoryItemcomo uma propriedade / campo WorldItemque é o que é colocado no inventário do jogador quando o item mundial é retirado.

Você deseja um método em algum lugar (na classe de jogador ou em qualquer classe de item) que lida com a adição de um item de inventário ao inventário do jogador, para lidar com o empilhamento de itens semelhantes.

George Duckett
fonte
Eu realmente gosto desta resposta, muito obrigado, faz muito sentido! Um último pensamento, digamos que a pessoa queira soltar um item, o item Inventário também precisaria de um WorldItem nele?
Ross
Se precisar ser bidirecional, eu ficaria tentado a ter uma classe de 'pesquisa' separada que armazenasse pares de itens mundiais e itens de inventário. Você usaria isso para procurar um, dado o outro.
George Duckett
Ohhh legal, nunca pensei nisso. Essa é uma ideia muito interessante. Como todos os itens são concretos, faz sentido procurá-los.
Ross
2
Eu destruiria o WorldItem quando ele fosse retirado e criaria um novo quando o item fosse descartado.
Simon Richter
Acordado. Não quis dizer o contrário.
George Duckett
0

Como mencionado antes, dividir-se em várias classes ou matrizes seria sua melhor aposta. Eu criaria 3 classes, Mundo, Jogador e Item. A classe mundial teria um List WorldItems, assim como a classe Player, mas denominada List Inventory Quando um jogador pega um item, você o move da lista no World. classe à lista na classe Player.

No loop de empate do seu jogo, você pode fazer um loop que atraia todos os itens da lista WorldItems para a tela, mas obviamente ignora a lista de Inventário no objeto do jogador.

Thomas
fonte
Meu método atual agora é que eu tenho uma classe WorldItem que encapsula um InventoryItem, ambos pertencentes ao mesmo item. No método de atualização do jogo, percorro todos os itens do mundo e testo os limites de colisão com o jogador. Se os dois colidem, o WorldItem é removido da lista WorldItem e é colocado no inventário do jogador (que é um List <> de InventoryItem)
Ross