Noticias

Se ha publicado un nuevo servicio, el Portal de Juegos Online

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 no destruir todas las instancias de un objeto  (Leído 442 veces)

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

Desconectado Fashion_Trozos

  • Habitual
  • *
  • Puntos: 141
  • Mensajes: 72
    • Ver Perfil
Hola, buenas. Tengo un problema que no consigo solucionar. Quiero que mi personaje pueda sacar 4 unidades de piedra cuando "pique" una roca y que despues esta se destruya. No estoy muy seguro de como hacerlo, consigo que pueda extraer 4 unidades de una roca pero después se destruyen todas las instancias de roca y no solo la que esta picando.

Lo he puesto en un evento colisión de mi protagonista hacia el objeto roca.

Código: [Seleccionar]
if distance_to_object(ob_piedra) < 4 and mouse_check_button_pressed(mb_left)
and position_meeting(mouse_x,mouse_y,ob_piedra) {

if scr_obtener_slot_libre() != -1 and global.primera_piedra == true {
   global.inventario[scr_obtener_slot_libre()] = "Piedra"
   global.primera_piedra = false;
   }
   
   global.cantidad_piedra++
   global.vida_piedra--
   }

if global.vida_piedra <= 0 {with other instance_destroy()}

if global.cantidad_piedra == 0 {
global.primera_piedra = true;
}



Me imagino que es una tontería de primero de programación. Un saludo!

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado Fashion_Trozos

  • Habitual
  • *
  • Puntos: 141
  • Mensajes: 72
    • Ver Perfil
Respuesta #1 en: Mayo 09, 2019, 03:17:56 pm
Ahora lo he intentado en el evento Create del prota i con instance nearest y tampoco

piedra_cercana = instance_nearest(x,y,ob_piedra)

if distance_to_object(ob_piedra) < 4 and mouse_check_button_pressed(mb_left)
and position_meeting(mouse_x,mouse_y,ob_piedra) {

if scr_obtener_slot_libre() != -1 and global.primera_piedra == true {
   global.inventario[scr_obtener_slot_libre()] = "Piedra"
   global.primera_piedra = false;
   }
   
   global.cantidad_piedra++
   global.vida_piedra--
   }

if global.vida_piedra <= 0 {
   if piedra_cercana != noone{
   instance_destroy(piedra_cercana)}
}


if global.cantidad_piedra == 0 {
   global.primera_piedra = true;
   }
   




 


Desconectado 3dgeminis

Respuesta #2 en: Mayo 09, 2019, 08:36:55 pm
El principal problema es que estas usando una variable global para controlar la vida de las rocas global.vida_piedra, y esta afecta a todas las instancias de ese objeto.
Lo que debes hacer es crear la variable local vida=4
Si vas a poner el codigo en el evento de colision, hay codigo que esta sobrando:
if mouse_check_button_pressed(mb_left) ///si cuando se colisiona con la roca se presiona el raton
  {
   with(other) ///hace referencia a la roca con la que esta colisionando
     {
      vida-=1 ///resta 1 a la variable vida de la roca
      global.cantidad_piedra+=1 ///agrega 1 a la variable global piedra
      if vida<=0 {instance_destroy()} ///si la vida de la roca llega a 0 se destruye
     
     }
  }

 
Los siguientes usuarios dieron las gracias a este tema: somnus, Fashion_Trozos


Desconectado Fashion_Trozos

  • Habitual
  • *
  • Puntos: 141
  • Mensajes: 72
    • Ver Perfil
Respuesta #3 en: Mayo 13, 2019, 07:50:52 pm
Hola, buenas tardes. Pues llevo un buen lio, me falta mucha base y me atasco con los problemas mas pequeños. Mi intención es que el personaje pueda picar roca al estar cerca de una de ellas. No me acaba de convencer que tenga que picarla exactamente con la colisión, me hace cosas raras (como que tengo que estar pulsando en dirección a la roca para que cuando pulse el mouse se sume una "piedra", me imagino que tiene que ver con la simpleza de la colisión en el evento o algo así, pero no estoy seguro), por eso había pensado en distance_to_object a unos 4 pixeles, ya no tendría que estar tan pegado a la roca y seria mas fácil. Lo que me pasa ahora es que haciendo algunos retoques en el código y colocandolo en la colisión con la roca pues funciona, puedo recoger 4 de piedra de una roca y después se destruye. El problema ahora es que una vez se destruye la primera roca cambia el comportamiento y vuelve a destruir cada roca solo con tocarla y deja de sumar piedra al contador (se destruye la instancia solo con colisionar). Supongo que el problema esta en que se deja de cumplir alguna condición o se empieza a cumplir otra o no se, pero no veo que hago mal. Realmente se que estoy haciendo un estropicio en cuanto al código, en cuanto aprenda un poco mas borraré el proyecto y empezaré uno nuevo heheh.

en el evento Colisión de mi protagonista hacia el ob_piedra
Código: [Seleccionar]
if mouse_check_button_pressed(mb_left)
and position_meeting(mouse_x,mouse_y,ob_piedra) {

if scr_obtener_slot_libre() != -1 and global.primera_piedra == true {
   global.inventario[scr_obtener_slot_libre()] = "Piedra"
   global.primera_piedra = false;
   }
   
   global.cantidad_piedra++
   ob_piedra.vida_piedra--
   }

if ob_piedra.vida_piedra <= 0 {with other instance_destroy()}

if global.cantidad_piedra == 0 {
global.primera_piedra = true;
}
Al final puse la variable vida_piedra en el mismo ob.piedra, no se porque era la única manera de que me funcionara

Por cierto, como haces para que el codigo que me pones se vea así con un fondo negro, coments en verde, etc? Queda y se entiende mejor que así como lo pongo yo
« última modificación: Mayo 13, 2019, 07:53:34 pm por Fashion_Trozos »

 


Desconectado 3dgeminis

Respuesta #4 en: Mayo 14, 2019, 04:42:47 pm
Tienes que poner el codigo de esta forma:


 


Desconectado Fashion_Trozos

  • Habitual
  • *
  • Puntos: 141
  • Mensajes: 72
    • Ver Perfil
Respuesta #5 en: Mayo 14, 2019, 10:36:18 pm
Tienes que poner el codigo de esta forma:


Que quieres decir, que si pongo ++ no es lo mismo que +=1?

 


Desconectado 3dgeminis

Respuesta #6 en: Mayo 15, 2019, 12:12:41 am
Disculpa por eso, es que uso GM8 y en en el no se puede poner ++ o --, o muchas otras mas cosas que en GMS y GMS2 si se pueden.

"Realmente se que estoy haciendo un estropicio en cuanto al código, en cuanto aprenda un poco mas borraré el proyecto y empezaré uno nuevo heheh."
Esa es una buena idea, vas a ver que te hara mas facil y rapido escribir codigo. Intenta varias soluciones a un problema, puedes llegar a reducir bastante el codigo que escribes.

 
Los siguientes usuarios dieron las gracias a este tema: Fashion_Trozos


Desconectado Fashion_Trozos

  • Habitual
  • *
  • Puntos: 141
  • Mensajes: 72
    • Ver Perfil
Respuesta #7 en: Mayo 15, 2019, 10:56:48 am
No te preocupes, na mas faltaría!  ;D