Noticias

¡Ayuda a la Comunidad GM, haz una donación!

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: Problema con instance_destroy()  (Leído 663 veces)

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

Desconectado jpsaenz

en: Octubre 10, 2018, 12:23:44 am
Hola,

Tengo un problema con intance_destroy() y no puedo solucionarlo. En el foro hay un hilo similar pero tampoco me ha resultado de ayuda.

Cuando mi personaje jugador pasa delante de ciertos objetos quiero que aparezca un pequeño sprite (en este caso un "[!]") sobre el objeto en cuestión para indicar una posibilidad de interacción, y que dicho símbolo desaparzca cuando el personaje se aleja.

El código que utilizo es el siguiente, en el objeto con el cual deseo interactuar:

EN CREATE:

Código: [Seleccionar]
var subtexpr;

EN STEP:

Código: [Seleccionar]
if  distance_to_object(obj_john)<3 {
    subtexpr = instance_create(x+7,y-15,obj_star);
};

if  distance_to_object(obj_john)>3 {
    with (subtexpr) {
    instance_destroy();
    }
};

Así como está, el código me da un error en la línea

Código: [Seleccionar]
    with (subtexpr) {

Si hago un

Código: [Seleccionar]
    with (obj_star) {

funciona bien, siempre y cuando no tenga más de un objeto para interactuar en la room, de lo contraroi funciona con el primero y los demás no (es lógico, pues el primer script en ejecutarse detecta que el jugador está a más de 3px de distancia del primer objeto y destruye el [!] en el momento de ser creado.

También he probado sin "with ()", es decir, intentando destruir el objeto creado con su propia ID (supuestamente, según el manual (https://docs.yoyogames.com/source/dadiospice/002_reference/objects%20and%20instances/instances/instance%20functions/instance_destroy.html), al crear el objeto con

Código: [Seleccionar]
variable = instance_create()
debería poder hacer un

Código: [Seleccionar]
instance_destroy(variable);
...pero TAMPOCO funciona.

Lo que necesito es, al alejarse el jugador, destruír la instancia en cuestión, y no TODOS los objetos "obj_star" de la habitación.

¿Cómo puedo realizar esto?

Gracias!
« última modificación: Octubre 10, 2018, 12:25:39 am por jpsaenz »

--
@jupixweb
 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado BssString

Respuesta #1 en: Octubre 10, 2018, 12:32:05 am
Hola jpsaenz

Estás complicando las cosas.
En el draw event del obj_john dibuja el sprite de la exclamación cuando el player esté cerca y listo..

Draw Event
Código: [Seleccionar]
draw_self()
If distance_to_object(obj_player) < 3 {
draw_sprite(sprite_exclamacion,x,y-20)
}

 
Los siguientes usuarios dieron las gracias a este tema: Yuzo


Desconectado knd144

  • Okupa
  • *
  • Puntos: 217
  • Mensajes: 529
  • Agradecido: 4 veces
  • Sexo: Masculino
  • Nunca pienso en el futuro, llega demasiado pronto.
    • Ver Perfil
    • Rincon knd144
Respuesta #2 en: Octubre 10, 2018, 12:57:05 am
Tal vez el error que te da en la línea:

Código: [Seleccionar]
  with (subtexpr) {
Sea por que en ese momento la variable subtexpr no tiene ningún valor. Revisa si tiene algún valor, o dale un valor por defecto tipo:

Código: [Seleccionar]
var subtexpr;
subtexpr = false;

Y en el step:

Código: [Seleccionar]
if  distance_to_object(obj_john)<3 {
    subtexpr = instance_create(x+7,y-15,obj_star);
};

if  (distance_to_object(obj_john)>3 && subtexpr!=false ) {
    with (subtexpr) {
    instance_destroy();
    }
};




Rincon knd144
-Proyecto Aquilesvania 60%
 
Los siguientes usuarios dieron las gracias a este tema: Yuzo


Desconectado jpsaenz

Respuesta #3 en: Octubre 10, 2018, 01:03:03 am
Hola jpsaenz

Estás complicando las cosas.
En el draw event del obj_john dibuja el sprite de la exclamación cuando el player esté cerca y listo..

Draw Event
Código: [Seleccionar]
draw_self()
If distance_to_object(obj_player) < 3 {
draw_sprite(sprite_exclamacion,x,y-20)
}

Hola, gracias por el consejo.

EN DRAW del objeto no jugador:

Código: [Seleccionar]
/// DRAW [!]
draw_self();
if distance_to_object(obj_john) < 3 {
draw_sprite(spr_star,0,x,y-20);
};

Me da un

Citar
Trying to draw non-existing sprite.
 at gml_Object_obj_transp_Draw_0 (line 2) - draw_self();

...por supuesto, "spr_star" SÍ existe!!!

Alguna idea?

gracias!

--
@jupixweb
 


Desconectado BssString

Respuesta #4 en: Octubre 10, 2018, 01:11:24 am
Hola jpsaenz

Falló el draw por la función "draw_self()" que dibuja el sprite del objeto que está corriendo el código.
Eso pasó porque tu objeto "obj_john" no tiene ningún sprite asignado en la configuración del objeto.
Simplemente borra el draw_self() y corriges el problema.

Saludos

 
Los siguientes usuarios dieron las gracias a este tema: Yuzo


Desconectado jpsaenz

Respuesta #5 en: Octubre 10, 2018, 01:12:33 am
Tal vez el error que te da en la línea:

Código: [Seleccionar]
  with (subtexpr) {
Sea por que en ese momento la variable subtexpr no tiene ningún valor. Revisa si tiene algún valor, o dale un valor por defecto tipo:

Código: [Seleccionar]
var subtexpr;
subtexpr = false;

...

Hola, gracias por contestar.

En CREATE le di un valor por defecto

Código: [Seleccionar]
subtexpr="";
también probé con un boleano, pero sin éxito. O no reconoce la variable o me pone "Inavalid comparision" cuando hago el ...&& != "" para destruír la instancia...

Cualquier idea es bienvenida!

--
@jupixweb
 


Desconectado jpsaenz

Respuesta #6 en: Octubre 10, 2018, 01:19:41 am
Hola jpsaenz

Falló el draw por la función "draw_self()" que dibuja el sprite del objeto que está corriendo el código.
Eso pasó porque tu objeto "obj_john" no tiene ningún sprite asignado en la configuración del objeto.
Simplemente borra el draw_self() y corriges el problema.

Saludos

En efecto, el objeto que está corriendo el código (no es "obj_john") no tiene el sprite de "[!]" asignado (está en otro objeto, en principio no activo en la room, por eso mi primera idea fue crear una instancia con dicho objeto al acercarse el jugador)

Cuando quito el "draw_self" como propones, en efecto funciona y el sprite aparece en el lugar correspondiente, pero desaparece el objeto original que corre el código (en realidad nunca aparece al cargar la room, entiendo que porque el objeto jugador se encuentra a más de 3px de distancia al iniciar)

--
@jupixweb
 
Los siguientes usuarios dieron las gracias a este tema: Yuzo


Desconectado knd144

  • Okupa
  • *
  • Puntos: 217
  • Mensajes: 529
  • Agradecido: 4 veces
  • Sexo: Masculino
  • Nunca pienso en el futuro, llega demasiado pronto.
    • Ver Perfil
    • Rincon knd144
Respuesta #7 en: Octubre 10, 2018, 01:21:45 am
Hola, gracias por contestar.

En CREATE le di un valor por defecto

Código: [Seleccionar]
subtexpr="";
también probé con un boleano, pero sin éxito. O no reconoce la variable o me pone "Inavalid comparision" cuando hago el ...&& != "" para destruír la instancia...

Cualquier idea es bienvenida!

¿Invalid comparison type? Ha de ser entonces que la versión de Game Maker que utilizas ya no permite hacer comparaciones de diferentes tipos de valores. Yo aún sigo con el GM8. :-[

Entonces dale por defecto un valor numérico:

Código: [Seleccionar]
subtexpr=-1;
Y que la condición sea:

Código: [Seleccionar]
if  (distance_to_object(obj_john)>3 && subtexpr!=-1 ) {
Ya que al crear una instancia y asignar su valor a una variable, ésta variable obtiene un valor numérico (Que yo recuerde).




Rincon knd144
-Proyecto Aquilesvania 60%
 
Los siguientes usuarios dieron las gracias a este tema: Yuzo


Desconectado jpsaenz

Respuesta #8 en: Octubre 10, 2018, 01:24:02 am
En efecto, el objeto que está corriendo el código (no es "obj_john") no tiene el sprite de "[!]" asignado (está en otro objeto, en principio no activo en la room, por eso mi primera idea fue crear una instancia con dicho objeto al acercarse el jugador)

Cuando quito el "draw_self" como propones, en efecto funciona y el sprite aparece en el lugar correspondiente, pero desaparece el objeto original que corre el código (en realidad nunca aparece al cargar la room, entiendo que porque el objeto jugador se encuentra a más de 3px de distancia al iniciar)

No existe un comando "draw" para dibujar otro objeto? Algo así como "draw_object(obj_star,x,y)" ...?

--
@jupixweb
 


Desconectado BssString

Respuesta #9 en: Octubre 10, 2018, 01:35:13 am
Hola jpsaenz

Es totalmente innecesario crear un objeto sólo para dibujar un signo de exclamación, un objeto ocupa más memoria porque trae consigo parámetros como ser sólido, persistente, hace draw event y se le asigna variables por defecto como "x", "speed", "image_angle", etc. Lo ideal es usar "draw_sprite" y ya.

En ese caso, usa una condición:
Código: [Seleccionar]
if sprite_index != -1 draw_self()
If distance_to_object(obj_player) < 3 {
draw_sprite(sprite_exclamacion,x,y-20)
}

Ese código primero verifica si tu objeto tiene un sprite asociado, si lo tiene, se dibuja a si mismo.
Eso evita el error de "Trying to draw non-existing sprite" y te evitas estar creando-destruyendo un objeto cada vez que lo necesites.

Saludos

 


Desconectado jpsaenz

Respuesta #10 en: Octubre 10, 2018, 01:56:28 am
Hola jpsaenz

Es totalmente innecesario crear un objeto sólo para dibujar un signo de exclamación, un objeto ocupa más memoria porque trae consigo parámetros como ser sólido, persistente, hace draw event y se le asigna variables por defecto como "x", "speed", "image_angle", etc. Lo ideal es usar "draw_sprite" y ya.

En ese caso, usa una condición:
Código: [Seleccionar]
if sprite_index != -1 draw_self()
If distance_to_object(obj_player) < 3 {
draw_sprite(sprite_exclamacion,x,y-20)
}

Ese código primero verifica si tu objeto tiene un sprite asociado, si lo tiene, se dibuja a si mismo.
Eso evita el error de "Trying to draw non-existing sprite" y te evitas estar creando-destruyendo un objeto cada vez que lo necesites.

Saludos

Entiendo que esa sea la mejor manera de gestionar los recursos.

No entiendo por qué el chequear si el objeto tiene un spriete (cualquiera!) asociado a sí mismo y en tal caso, dibujarse, elimina el error que se procuce cuando al dibujarse sin chequear esa condición se intenta dibujar el sprite no asociado con ese objeto (tampoco asociado a él en el caso de no producirse el chequeo mencionado), pero quizás seguro tiene una lógica que se me escapa.

Como sea, así funciona: ¡gracias!
« última modificación: Octubre 10, 2018, 02:13:51 am por jpsaenz »

--
@jupixweb