Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Fashion_Trozos en Mayo 09, 2019, 02:50:52 PM

Título: Como no destruir todas las instancias de un objeto
Publicado por: Fashion_Trozos en Mayo 09, 2019, 02:50:52 PM
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.


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!
Título: Re:Como no destruir todas las instancias de un objeto
Publicado por: Fashion_Trozos 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;
   }
   



Título: Re:Como no destruir todas las instancias de un objeto
Publicado por: 3dgeminis 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:
[gml]
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
     
     }
  }
[/gml]
Título: Re:Como no destruir todas las instancias de un objeto
Publicado por: Fashion_Trozos 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

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
Título: Re:Como no destruir todas las instancias de un objeto
Publicado por: 3dgeminis en Mayo 14, 2019, 04:42:47 PM
Tienes que poner el codigo de esta forma:
(https://i.imgur.com/21ne5Ov.png)
Título: Re:Como no destruir todas las instancias de un objeto
Publicado por: Fashion_Trozos en Mayo 14, 2019, 10:36:18 PM
Cita de: 3dgeminis en Mayo 14, 2019, 04:42:47 PM
Tienes que poner el codigo de esta forma:
(https://i.imgur.com/21ne5Ov.png)

Que quieres decir, que si pongo ++ no es lo mismo que +=1?
Título: Re:Como no destruir todas las instancias de un objeto
Publicado por: 3dgeminis 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.
Título: Re:Como no destruir todas las instancias de un objeto
Publicado por: Fashion_Trozos en Mayo 15, 2019, 10:56:48 AM
No te preocupes, na mas faltaría!  ;D