¿Cómo hacer un sistema de inventario mundial para jugadores?

11

Me encuentro con un problema al tratar de implementar un sistema de inventario dentro de XNA (realmente no importa, podría ser cualquier plataforma), pero hasta ahora. Aquí está el problema que estoy tratando de entender:

¿Cómo puedo obtener un objeto del mundo (piensa que cuando matas a un monstruo deja caer una armadura) y lo pongo en el inventario de mi jugador?

Si un inventario es solo una lista de artículos, técnicamente, ¿cómo podría llevar Steel Sword del mundo al inventario de mi jugador sin que una clase haga más de una cosa?

Actualmente tengo una estructura de elementos, que contiene un valor hexadecimal único, un recuento de cuántos elementos hay (para apilables, como flechas) y una textura para representar dentro del inventario, y algunas otras propiedades sin importancia (nombre, descripción, etc.) .

Sería un mal diseño si tuviera que modificar mi clase de elemento existente para albergar una posición mundial, junto con la detección de colisión (no quiero que el elemento caiga a través de la tierra).

Gracias por cualquier consideración!

Ross
fuente
44
¿No puedes tener uno WorldItemque sea separado para ti InventoryItem? (Tal vez WorldItemtiene una InventoryItemplantilla que se coloca en el inventario del jugador cuando se recoge).
George Duckett
1
@GeorgeDuckett Debería responder a esto ... probablemente debería haber algún método en el Inventoryque tome un WorldItemy lo agregue como InventoryItem. Para que también pueda manejar casos donde los elementos necesitan apilarse (por ejemplo, flechas).
bummzack
@bummzack: Listo.
George Duckett

Respuestas:

17

El enfoque que seguiría es tener 2 estructuras (o clases) diferentes. WorldItemy InventoryItem.

A continuación, puede agregar un InventoryItemcomo una propiedad / campo de su WorldItemque es lo que se coloca en el inventario del jugador cuando se recoge el elemento del mundo.

Desearía un método en algún lugar (en la clase de jugador, o en cualquier clase de elemento) que maneje agregar un elemento de inventario al inventario del jugador, para tratar de apilar elementos similares.

George Duckett
fuente
Realmente me gusta esta respuesta, muchas gracias, ¡tiene mucho sentido! Un último pensamiento, digamos que la persona quiere soltar un artículo, ¿el artículo del Inventario también necesitaría un WorldItem dentro de él?
Ross
Si necesita ser de 2 vías, estaría tentado a tener una clase de 'búsqueda' separada que almacenara pares de artículos mundiales y artículos de inventario. Luego usarías eso para buscar uno, dado el otro.
George Duckett
Ohhh bien, nunca pensé en eso. Esa es una idea muy interesante. Como todos los artículos son concretos, tiene sentido buscarlos.
Ross
2
Destruiría el WorldItem cuando lo recoja y crearía uno nuevo cuando suelte el elemento.
Simon Richter
Convenido. No quise implicar lo contrario.
George Duckett
0

Como se mencionó antes, dividir en múltiples clases o matrices sería su mejor apuesta. Crearía 3 clases, Mundo, Jugador y Objeto. La clase mundial tendría una Lista de Artículos del Mundo, al igual que la clase Jugador, pero llamada Inventario de Lista. Cuando un jugador recoge un artículo, lo mueve de la lista en el Mundo. clase a la lista en la clase Player.

En el ciclo de dibujar de su juego, puede hacer un ciclo que dibuje todos los elementos en la lista de WorldItems a la pantalla, pero por supuesto ignora la lista de inventario en el objeto del jugador.

Thomas
fuente
Mi método actual en este momento es que tengo una clase WorldItem que encapsula un InventoryItem, ambos pertenecientes al mismo elemento. En el método de actualización del juego recorro todos los elementos del mundo y pruebo los límites de colisión con el jugador. Si los dos chocan, WorldItem se elimina de la lista de WorldItem y se coloca en el inventario del jugador (que es una Lista <> de InventoryItem)
Ross