Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Ashe de Freljord en Noviembre 16, 2018, 05:42:46 AM

Título: guardar item con atributos
Publicado por: Ashe de Freljord en Noviembre 16, 2018, 05:42:46 AM
Hola, estoy haciendo un sistema de inventario, en el cual quiero guardar items.

Por ejemplo 1 manzana.
El problema que tengo es que ese item tiene atributos, como ser el estado. Por ejemplo si yo quisiera vender una manzana desde mi inventario, diferente sería si su estado es "fresca" contra "podrida".
Entonces dependiendo del atributo se daría mas o menos oro.
Lo que no se me figura es cómo hacer para guardar un item que tenga atributos.


Había pensado ir guardando los items por nombre, ya que son únicos. Entonces al colisionar, se iría llenando el array. Pero como digo, necesitaria guardar tambien los atributos, porque son varios dentro de un objeto. como ser el precio, el estado, tamaño.

Título: Re:guardar item con atributos
Publicado por: kostra en Noviembre 16, 2018, 02:10:57 PM
Yo usaria arrays, probablemenete ya usas algo como item[id] con valor 0 o false si no lo tienes y con 1 o true para cuando si lo tienes, para ese ejemplo piedes extender el valor, por ejemplo si la manzana es el id 4 entonces item[4] = 0; es que no tienes manzana, item[4] =1; es que tienes manzana fresca e item[4] = 2; es que tienes manzana podrida.
Si no tienes ids de referencia para los items te lo recomiendo enormemente y si necesitas poner X cantidad de manzanas puedes usar una variable cantidad para cada slot.
Y ahora es cuando viene el chulo de las listas dinamicas y te dice un ejemplo mejor xdddd pero de mientras... xd
Título: Re:guardar item con atributos
Publicado por: Ashe de Freljord en Noviembre 16, 2018, 03:18:05 PM
Gracias por la respuesta,
Pero la verdad quería evitar eso, puesto que de cierta manera se pierde un poco  la legibilidad del codigo, al tener que apuntar una lista aparte, en papel, para saber que índice le corresponde a qué cosa. Mas bien quisiera agarrar un objeto en concreto y preguntar sobre su estado.

De todas maneras me diste una gran idea, creo que voy a agrupar todas las variables dentro de un array, y luego, si se puede usarla dentro de la grilla. A ver que tal me va, cualquier cosa voy a seguir preguntando.
Título: Re:guardar item con atributos
Publicado por: somnus en Noviembre 16, 2018, 07:11:52 PM
lo que tienes que hacer es usar objetos y herencia, por ejemplo


base_item

EV_CREATE
{
estado = B;//B = Bueno, M= malo, p= Podrido, G = con gusanos
costo = 0;
img = noone;
... y todos las demas propiedades que necesites
}

creas otro objeto que tenga como padre a base_item

obj_manzana_item
EV_CREATE
{
inherith_event(); //no recuerdo bien el nombre va algo asi
estado = "B";
costo=100;
img = sprite_manzana;
...etc,etc.
}

NOTA1: tu objeto base puede tener una alarma que se ejecuta cuando compra, etc, esos eventos los tendran Tambien, los items hijos.
NOTA2: estos objetos los puedes meter en una lista, esa lista la transformas en texto y ese texto lo metes en un arcihvo INI, asi es como usualmente hago mis inventarios con items persistentes.
Título: Re:guardar item con atributos
Publicado por: Ashe de Freljord en Noviembre 17, 2018, 02:16:44 AM
A la final opte por la solucion chapucera, que fue ocultar los items que iba agarrando, puesto que Game Maker, solo acepta, dos tipos de datos en sus estructuras: numero y cadena

La verdad debería poder almacenar punteros.
Ya mucho tenía con que no se pueden hacer estructuras de datos.

Cita de: somnus en Noviembre 16, 2018, 07:11:52 PM
lo que tienes que hacer es usar objetos y herencia, por ejemplo


base_item

EV_CREATE
{
estado = B;//B = Bueno, M= malo, p= Podrido, G = con gusanos
costo = 0;
img = noone;
... y todos las demas propiedades que necesites
}

creas otro objeto que tenga como padre a base_item

obj_manzana_item
EV_CREATE
{
inherith_event(); //no recuerdo bien el nombre va algo asi
estado = "B";
costo=100;
img = sprite_manzana;
...etc,etc.
}
Si, esa jerarquía la hice, hice una clase abstracta para items y de ahi fui heredando.
Iba a almacenarlos en archivos de texto y todo, pero pensé que podría significar un costo bastante elevado en tiempo de ejecucion al estar usando el disco duro constantemente al abrir archivos, y ni hablar de procesar las cadenas para obtener los atributos. Eso sin contar el trabajo de programar todo eso, para que eventualmente se ejecute mas lento XD
Título: Re:guardar item con atributos
Publicado por: Johann en Noviembre 17, 2018, 02:37:55 AM
Ud cono los enums? son estructuras de datos al estilo C. Aunque dice que no se pueden modificar los datos una vez creados, es decir son inmutables, tal ves le sirven para definir las características de los objetos, no se.
Título: Re:guardar item con atributos
Publicado por: Ashe de Freljord en Noviembre 17, 2018, 04:22:35 PM
También los utilicé, de hecho los uso para determinar el estado y el tipo de objeto.
Pero hay atributos que son variables, como el precio, que depende del estado.

Título: Re:guardar item con atributos
Publicado por: kostra en Noviembre 17, 2018, 05:44:20 PM
Y si de un principio en vez de poner un numerito y que sea inmutable no se puede poner una variable? (ignorancia ON)
Título: Re:guardar item con atributos
Publicado por: Johann en Noviembre 17, 2018, 06:24:14 PM
Eso se puede hacer con las macros, incluso en las macros se pueden poner funciones, listas, mapas, etc.
Título: Re:guardar item con atributos
Publicado por: Ashe de Freljord en Noviembre 17, 2018, 06:33:59 PM
Lo que intento hacer es una grilla 4 x 5, donde cada elemento es un item con atributos:
-nombre
-estado
-precio_venta
-tipo

Basicamente estoy haciendo un inventario, en el que al pasar el mouse por encima me muestre estos datos de ahi arriba.

Yo podría colocar numeros que significasen cada objeto:
0 = manzana normal
1 = manzana en mal estado
2 = cuchara
3 = frasco vacio

Lo que sucede es que quiero que mi inventario sea escalable, en el caso anterior debiera de alguna manera verificar si es cada cosa:

if (item == 0)
     mensaje("esta es una manzana en buen estado")
if (item == 1)
   mensaje("esta manzana esta mala")


Lo que quiero hacer, es algo mas automatizado, acorde vaya creciendo el juego y eventualmente agregando nuevos items. Lo ideal sería simplemente obtener el item y mostrar sus atributos

var item = ds_grid_value(grilla_inventario, i, j);
mensaje(item.estado)
mensaje(item.precio)
mensaje(item.descripcion)

Y las ds_* solo aceptan cadenas o numeros.
Título: Re:guardar item con atributos
Publicado por: kostra en Noviembre 17, 2018, 07:56:08 PM
De verdad que no entiendo tu problema, solo puedes poner cadenas o numeros... Entonces que pretendes poner si no es ni cadena ni numero??? :S
Título: Re:guardar item con atributos
Publicado por: Ashe de Freljord en Noviembre 17, 2018, 07:59:38 PM
Un objeto XD
Título: Re:guardar item con atributos
Publicado por: 3dgeminis en Noviembre 17, 2018, 09:06:48 PM
Si es el nombre de un objeto es una cadena, si es una instancia en especifico seria un numero(su id)
Lo que podes hacer es usar una ds_grid, donde cada fila es un objeto diferente, y las columas serian sus atributos.
Esto seria para guardar los datos, ahora para mostrarlos  en pantalla podrias crear un objeto y darle las propiedades guardadas en la grilla.

(https://i.imgur.com/L1hghec.png)