Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: Como picar piedra? [SOLUCIONADO]  (Leído 239 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Fashion_Trozos

  • Habitual
  • *
  • Puntos: 141
  • Mensajes: 72
    • Ver Perfil
en: Mayo 14, 2019, 04:00:20 pm
Llevo un par días pues eso, intentando picar piedra que digamos. Me gustaría que me propusierais lógicas fáciles de como hacer algo así. La intención es que cuando el personaje se acerque a menos de 4 pixeles de una "roca" y pulse, por ejemplo, espacio, le reste 1 a la vida de la piedra, cuando la piedra pierda digamos 4 vidas se destruya.
Lo he intentado de varias maneras y no consigo hacerlo bien. O se me destruye el protagonista, o todas las rocas o no pasa nada. He intentado ir simplificandolo todo hasta que he empezado un proyecto solo para probar esto mismo y ni aun así. Os pongo el código de esto último.

Código: [Seleccionar]
if distance_to_object(ob_roca) < 4 and keyboard_check_pressed(vk_space){
ob_roca.vida_roca--
}

if ob_roca.vida_roca == 0 {
instance_destroy(instance_nearest(x,y,ob_roca))
}

Pero al "picar" 4 de piedra desaparecen todas las instancias y me da este error:

Unable to find any instance for object index '2' name 'ob_roca'
 at gml_Object_ob_prota_Step_0 (line 36) - if ob_roca.vida_roca == 0 {

La vida de la roca se la puse en el CREATE del ob_roca. Puede que ese sea el error?

Y si lo intento con un evento colision me pasa lo siguiente.

Código: [Seleccionar]
if keyboard_check_pressed(vk_space) {
ob_roca.vida_roca--
}

if ob_roca.vida_roca == 0 {
with other instance_destroy()
}

De esta manera me funciona el invento, pero claro, solo una vez. Me imagino que es porque la variable vidas_roca baja a "0" me sirve para que desaparezca la primera instancia en a que estoy "picando" pero después, en las demás, las destruye solo con colisionar al cumplirse if ob_roca.vida_roca == 0 . No podrían tener cada instancia del ob_roca sus propias vidas??? por decirlo de alguna manera.

Añadiendo un poco mas al código (ob_roca.vida_roca +=4) puedo hacer que funcione hasta la penúltima instancia, cuando se terminan las instancias en la room el invento peta

Código: [Seleccionar]
if keyboard_check_pressed(vk_space) {
ob_roca.vida_roca--
}

if ob_roca.vida_roca = 0 {
with other instance_destroy()
ob_roca.vida_roca +=4
}

PD: Tengo otro post abierto en el que el problema es muy similar, pero pensé que podía simplificarlo y así alguien podría responderme fácilmente a este problema y quedaría solucionado para próximos principiantes como yo. Si alguno de los dos queda solucionado, borraría el otro

« última modificación: Mayo 15, 2019, 10:57:12 am por Fashion_Trozos »

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado artmaker

Respuesta #1 en: Mayo 14, 2019, 05:49:14 pm
En el primer codigo, puede que dé error porque al ser destruida la ultima roca, el programa sigue buscando si hay mas, me paso algo parecido, puedes intentar agregar
Código: [Seleccionar]
if instance_exists(ob_roca) ocurra lo siguiente.

Una manera que se me ocurre , seria crear un "pico", puede ser invisible o visible dependiendo de lo que busques.
entonces en el evento step del jugador colocamos:

Código: [Seleccionar]
if keyboard_check_pressed(ord("Q"))
{
pico = instance_create_layer(x,y,"Player",obj_pico)
}

if keyboard_check_released(ord("Q"))
{
instance_destroy(pico)
}

para las rocas:

en evento create:
Código: [Seleccionar]
invulnerable = false
t=0

step event:

Código: [Seleccionar]
if invulnerable == true{
t ++
image_alpha = 0
if t ==10{invulnerable = false;t=0;image_alpha=1}
}
if hp <= 0 {instance_destroy()}
en esta parte la roca parpadeara para que asi la colision no le reste hp en cada frame, y solo lo haga al dejar de ser "invulnerable"

y en collision con el pico seria

Código: [Seleccionar]
if invulnerable == false {hp-=1;invulnerable = true}
el hp lo puedes colocar en las definiciones de variables, asi puedes cambiar mas facilmente cada variable su hp:


Por ultimo creamos el obj_pico, este no es necesario que tenga nada.





 
Los siguientes usuarios dieron las gracias a este tema: Fashion_Trozos


Desconectado Fashion_Trozos

  • Habitual
  • *
  • Puntos: 141
  • Mensajes: 72
    • Ver Perfil
Respuesta #2 en: Mayo 14, 2019, 10:34:20 pm
Al final me ha ido bien con lo de if instance_exists

Código: [Seleccionar]
if keyboard_check_pressed(vk_space) {
ob_roca.vida_roca--
}

if ob_roca.vida_roca = 0 {
with other instance_destroy()
if instance_exists(ob_roca) {ob_roca.vida_roca +=4}
}

 


Desconectado Fashion_Trozos

  • Habitual
  • *
  • Puntos: 141
  • Mensajes: 72
    • Ver Perfil
Respuesta #3 en: Mayo 14, 2019, 11:06:53 pm
Y para ponerlo en el evento step lo he echo así ha funcionado

Código: [Seleccionar]
if distance_to_object(ob_roca) < 4 and keyboard_check_pressed(vk_space){
ob_roca.vida_roca--
}

if instance_exists(ob_roca){
if ob_roca.vida_roca = 0 {
instance_destroy(instance_nearest(x,y,ob_roca))
if instance_exists(ob_roca) {ob_roca.vida_roca += 4}
}
}

 


Desconectado 3dgeminis

Respuesta #4 en: Mayo 15, 2019, 12:00:10 am
Para tener un poco mas claro la diferencia entre objetos e instancias, un pequeño texto de un articulo:

Diferencia entre instancias y objetos
En realidad, no colocamos los objetos en una room para que se ejecuten. Lo que colocamos son instancias de esos objetos. Y, ¿qué es una instancia en Game Maker? Podemos decir que una instancia es una copia de ese objeto, una plantilla con todas las características que pueden hacer. Lo comento porque hay cosas que se pueden hacer con objetos y cosas que se pueden hacer con instancias, ya que aunque lo parezca no es lo mismo.
¿Porqué es diferente? Cuando decimos que algo afecta a una instancia, afecta solo a esa copia en particular que se ha creado en la room. Si existen otras instancias del mismo objeto, a esas no les afecta en nada. Cuando decimos que algo afecta a un objeto, le afectará a todas las instancias que hay en la room en ese momento.

(www.aprendegamemaker.com/introduccion-objetos-game-maker-studio/)

 
Los siguientes usuarios dieron las gracias a este tema: Fashion_Trozos


Desconectado artmaker

Respuesta #5 en: Mayo 15, 2019, 03:25:14 am
Al final me ha ido bien con lo de if instance_exists

Código: [Seleccionar]
if keyboard_check_pressed(vk_space) {
ob_roca.vida_roca--
}

if ob_roca.vida_roca = 0 {
with other instance_destroy()
if instance_exists(ob_roca) {ob_roca.vida_roca +=4}
}

que bueno que te haya funcionado!, me alegro

 
Los siguientes usuarios dieron las gracias a este tema: Fashion_Trozos


Desconectado Fashion_Trozos

  • Habitual
  • *
  • Puntos: 141
  • Mensajes: 72
    • Ver Perfil
Respuesta #6 en: Mayo 15, 2019, 10:55:17 am
Para tener un poco mas claro la diferencia entre objetos e instancias, un pequeño texto de un articulo:

Diferencia entre instancias y objetos
En realidad, no colocamos los objetos en una room para que se ejecuten. Lo que colocamos son instancias de esos objetos. Y, ¿qué es una instancia en Game Maker? Podemos decir que una instancia es una copia de ese objeto, una plantilla con todas las características que pueden hacer. Lo comento porque hay cosas que se pueden hacer con objetos y cosas que se pueden hacer con instancias, ya que aunque lo parezca no es lo mismo.
¿Porqué es diferente? Cuando decimos que algo afecta a una instancia, afecta solo a esa copia en particular que se ha creado en la room. Si existen otras instancias del mismo objeto, a esas no les afecta en nada. Cuando decimos que algo afecta a un objeto, le afectará a todas las instancias que hay en la room en ese momento.

(www.aprendegamemaker.com/introduccion-objetos-game-maker-studio/)

Gracias por responder. Esto que pones creo que mas o menos lo tengo claro, lo que manda en as propiedades de las instancias es el objeto. Viendo un vídeo de Hektor Profe en el que ponía un ejemplo de unos moldes de galletas y las galletas lo entendí muy bien. Pero el problema me viene en cuanto hago por ejemplo un instance_destroy y se destruyen todas la instancias a la vez, o en saber como afectara cierta cosa si lo colocas en el evento step o en uno de colisión. No tengo nada de base, hace un par de meses no sabía ni que quería decir programar jejej, al ir tan escaso pues ciertas cosas que a lo mejor son muy básicas se me escapan