Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Elpacoviejo en Marzo 25, 2015, 02:18:55 PM

Título: Inventario y levantar armas del suelo?
Publicado por: Elpacoviejo en Marzo 25, 2015, 02:18:55 PM
Hola, antes que nada disculpen la molestia.

Ya hace unos cuantos meses me estoy acostumbrando al GM pero todavía hay cosas que me cuestan entender. Por suerte en este foro busqué muchas dudas y ya solucioné bastantes de mis problemas, pero creo que me compliqué mucho en tratar de hacer un inventario y "lootear" armas del suelo.

Estuve viendo en las descargas del foro y no pude hacerlo, hasta leí que se puede hacer en una room diferente, pero no entendí sinceramente, hay muchas "guías" que no explican todo, por eso vengo a consultar. Tampoco me quiero complicar la vida, mi idea era que apretando la "I" se abra un inventario donde esten los items que recolecté, pero creo primero tendría que poder recolectar esos items, ya que no se como hacerlo. Por ej, tengo que hacer que mi player pegue dispare sin armas porque no se como "levantar" armas y equiparlas.

Se que no es fácil, menos para un principiante que lleva poco más de medio año, pero si me pueden aclarar algunas cosas como para que intente les agradecería.

Hasta luego!

EDIT: Aunque yo prefiera un inventario en el que yo pueda elegir la magnitud de mismo, como para agarrar varios items (Comida, bebida, armas, etc) si para ir aprendiendo me conviene más hacer un inventario chico que esté siempre visible, no es molestia. Toda ayuda es bienvenida, todo sea por aprender :)
Título: Re:Inventario y levantar armas del suelo?
Publicado por: penumbra en Marzo 25, 2015, 06:52:51 PM
Imagina que hay en el suelo un objeto munición que si lo recoges te da balas. El objeto munición sería algo como

CREATE[gml]
num_balas = 10
libre = true[/gml]

STEP[gml]
if (libre == false)
     instance_destroy()          //El item se autodestruye al ser recogido por el jugador[/gml]


Para recoger el item, se puede usar el evento de colisión entre el jugador y el item. Voy a hacerlo en el jugador:
[gml]
if other.libre == true                //¿El item está "libre"?
{
     total_balas += other.num_balas   //Sumar las balas que otorga el item a las balas del jugador
      other.libre = false                     //El objeto fue recogido, ya no está "libre"
}
[/gml]

El objeto munición se puede destruír en el mismo evento de colisión, en lugar de usar su evento STEP, pero lo hice así para que veas cómo un objeto puede cambiar la variable de otro, y cómo ese otro objeto revisa esa variable y se desencadena una acción cuando se cumple una condición. Si en lugar de que el objeto munición se pierda y sus balas se sumen en automático, quieres que el "objeto" se vaya a un inventario, puedes tener un arreglo en el jugador

CREATE[gml]
balas = 0; granadas = 1; kitMedico = 2
inventario[balas] = 0
inventario[granadas] = 0
inventario[kitMedico] = 0[/gml]
Cuando tomes un item, en el evento de colisión, la línea
[gml] total_balas += other.num_balas[/gml]
la cambiarías por[gml]
inventario[balas] += 1      //Sumar un paquete de municiones al elemento[0] del arreglo[/gml]
Título: Re:Inventario y levantar armas del suelo?
Publicado por: quiero aprender en Marzo 25, 2015, 07:08:43 PM
Hola
Bueno eso es algo un poco complicado, yo también llevo bastante tiempo con el game maker y a un no se hacer muchas cosas difíciles.

Encontre un video que te puede servir en YouTube y me ayudo mucho con el inventario, la cosa es que esta en ingles pero solo has los mismo que el.
enlace: https://www.youtube.com/watch?v=LwBC6kyTa0M
Título: Re:Inventario y levantar armas del suelo?
Publicado por: Elpacoviejo en Marzo 25, 2015, 08:59:32 PM
Me sirvió bastante tanto el código como el vídeo! Pero que parte del code tendría que cambiar para por ejemplo agarrar la munición con la tecla E? Se hacerlo pero que parte tendría que cambiar para que no me tire errores.
Título: Re:Inventario y levantar armas del suelo?
Publicado por: penumbra en Marzo 25, 2015, 09:36:43 PM
Cita de: Elpacoviejo en Marzo 25, 2015, 08:59:32 PM
Pero que parte del code tendría que cambiar para por ejemplo agarrar la munición con la tecla E? Se hacerlo pero que parte tendría que cambiar para que no me tire errores.
Errores hay muchos, así que tendrías que aclarar que errores son esos.
[gml]
if (other.libre == true) and (keyboard_check_pressed(ord('E')) )
{
      inventario[balas] += 1
      other.libre = false                     //El objeto fue recogido, ya no está "libre"
}[/gml]
Título: Re:Inventario y levantar armas del suelo?
Publicado por: Elpacoviejo en Marzo 26, 2015, 12:14:17 AM
Cita de: penumbra en Marzo 25, 2015, 09:36:43 PM
Cita de: Elpacoviejo en Marzo 25, 2015, 08:59:32 PM
Pero que parte del code tendría que cambiar para por ejemplo agarrar la munición con la tecla E? Se hacerlo pero que parte tendría que cambiar para que no me tire errores.
Errores hay muchos, así que tendrías que aclarar que errores son esos.
[gml]
if (other.libre == true) and (keyboard_check_pressed(ord('E')) )
{
      inventario[balas] += 1
      other.libre = false                     //El objeto fue recogido, ya no está "libre"
}[/gml]

Me sirvió, muchas gracias! Ahora voy a ver como dibujo un inventario :)
Título: Re:Inventario y levantar armas del suelo?
Publicado por: Elpacoviejo en Marzo 26, 2015, 02:43:59 AM
Hola, siento molestar de nuevo, pero tuve un problema...
Todo venía bien, aún no pude dibujar el inventario ni entender como aplicarlo, pero estoy priorizando otras cosas. Como tu me dijiste pude hacer lo de la munición en el suelo y recogerla, pero intenté añadir un arma al suelo, recogerla y no pasa nada. Ni siquiera me cambia al sprite del hombre con el arma, que puedo estar haciendo mal? :'(
Título: Re:Inventario y levantar armas del suelo?
Publicado por: penumbra en Marzo 26, 2015, 02:52:21 AM
Indica por favor qué código estás usando y en qué evento. Es necesario para saber dónde está el error. Ten en cuenta que si quieres recoger un objeto arma, tienes que hacer un evento de colisión para el objeto arma (aparte del que ya hiciste para las municiones)

El problema de esto es que si tienes muchos items distintos, no es muy inteligente agregar un evento de colisión para cada uno (obvio que se puede, pero no es lo mejor). Es más óptimo agrupar todos los items recolectables bajo un objeto padre común. Eso haría que con un solo evento de colisión se pudieran recoger distintos items (munición, dinero, armas, accesorios, etc)
Título: Re:Inventario y levantar armas del suelo?
Publicado por: Elpacoviejo en Marzo 26, 2015, 03:00:29 AM
Hm, entonces me "rendiría" más crear un objeto que colisione con el player y usar los mismos códigos?.

Con el obj_arma use otra colisión también, tal vez mi error es que quedó casi todo igual al de munición. Tendría que validar que dispare.
Título: Re:Inventario y levantar armas del suelo?
Publicado por: penumbra en Marzo 26, 2015, 03:07:08 AM
Cita de: Elpacoviejo en Marzo 26, 2015, 03:00:29 AM
Con el obj_arma use otra colisión también, tal vez mi error es que quedó casi todo igual al de munición.

Para el objeto arma, no debes usar esto:
inventario[balas] += 1

porque el +1 se va a ir al elemento destinado a las balas en el arreglo del jugador. Siguiendo el ejemplo de mi primer respuesta, tendrías que declarar una variable arma = 3, y luego, en el evento de colisión
inventario[arma] += 1
Para que el +1 del arma se vaya a su lugar correcto. No debes mezclar munición con armas.

Cita de: Elpacoviejo en Marzo 26, 2015, 02:43:59 AM
Ni siquiera me cambia al sprite del hombre con el arma, que puedo estar haciendo mal? :'(
Tienes que verificar que inventario[arma] sea mayor o igual a 1, eso indicaría que tienes un arma.
[gml]
if (inventario[arma] >= 1)
     sprite_index = sprite_player_con_arma[/gml]
Título: Re:Inventario y levantar armas del suelo?
Publicado por: Elpacoviejo en Marzo 26, 2015, 03:11:45 AM
Justo estaba editando mi respuesta anterior para mostrarte como me estaba quedando pero se me reinició la pc así que voy de nuevo.

Justamente pensé lo mismo que tú, y cree un nuevo inventario[armas] = 0

Y en la colisión también lo cambié por inventario[armas] += 1

Tal vez esto ayude un poco más, mi jugador antes disparaba sin necesidad de agarrar armas o municiones, en el create del personaje tengo variable ammo y max_ammo, también firing y la velocidad y daño de mi obj_bala.