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: Codigos que son iguales pero trabajan diferente (RESUELTO)  (Leído 369 veces)

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

Desconectado Alemar5

  • Habitual
  • *
  • Puntos: 65
  • Mensajes: 31
  • Sexo: Masculino
    • Ver Perfil
Hola amigos, primero que nada buenas tardes xd y segundo...

Tengo un código que corresponde a la creación de un textbox rpg, lo que sucede es que esta instancia al terminar todos los textos se debería destruir y dejar que el personaje se mueva, el caso es que cree una copia del objeto textbox y ligue el objeto a esa copia, lo que sucede es que cuando uso la copia el objeto textbox(copia) no se destruye, si no que se reinicia, el objetivo de la copia del textbox es poder modificarlo, pero con este problema no puedo hacer nada, como puedo arreglar este problema?

[obj_textbox] (original)

[create]
indice = 0;

mensaje = "";

alarm[0] = 1;

///coloca el cuadro de texto en la parte inferior de la pantalla
x = __view_get( e__VW.XView, 0 )+0;
y = __view_get( e__VW.YView, 0 )+176;


[Step]

/// @description  preciona enter y cambia de dialogo
if keyboard_check_pressed(ord("X")) and indice <= referencia.final{
   if (mensaje == referencia.msg[indice]){
       indice += 1;
       global.mensaje += 1;
       if (indice > referencia.final) { obj_prota.stop = false; instance_destroy(); }
       mensaje = "";
       }else{
             mensaje = referencia.msg[indice];
       }
}

///coloca el cuadro de texto en la parte inferior de la pantalla
x = __view_get( e__VW.XView, 0 )+0;
y = __view_get( e__VW.YView, 0 )+176;


[Alarm_0]

if (string_length(mensaje) < string_length(referencia.msg[indice])){
    mensaje += string_char_at(referencia.msg[indice],string_length(mensaje)+1);
    audio_play_sound(snd_letras,1,false);
}

alarm[0] = 1;


[Draw]

/// @description dibujar textbox
draw_self(); //permitir ver el sprite del objeto
draw_set_font(fnt_textbox); //fuente del texto
draw_set_color(c_white); //color
draw_text_ext(x+20,y+7,string_hash_to_newline(mensaje),string_height(string_hash_to_newline("W")),310-60); //dibujar bucle de texto
draw_set_halign(fa_left); //alineacion del texto


[Objeto protagonista]

[Step]

///Refrigerador

var  bloque;
bloque = collision_circle(x,y,5,obj_refrigerador,true,false);

if (keyboard_check_pressed(ord("X")) and bloque){
    var msg;
    msg = instance_create(0,0,obj_textbox_refrigerador);
    msg.referencia = bloque;
    stop = true;
   
}

[objeto_refrigerador]

[create]

msg[0] = "Encima del refrigerador hay#un tarro de galletas.";
msg[1] = "Parece que solo queda una#galleta...";
msg[2] = "¿Tomas la ultima galleta?";
msg[3] = "Has tomado la ultima galleta!"
msg[4] = "Michael: Oye, por cierto#no vallas a tomar mi galleta que deje en el tarr...";
msg[5] = "...";
msg[6] = "Olvidalo...";

final = 6

global.mensaje = 0

depth = -y;

[como quisiera modificar el textbox]

[step textxbox]

/// @description  preciona enter y cambia de dialogo
if keyboard_check_pressed(ord("X")) and indice <= referencia.final{
   if (mensaje == referencia.msg[indice]){
       indice += 1;
       global.mensaje += 1;
       
        if (indice = 3) { alarm[1] = 10 }
       
       if ((indice > 3) && (canskip = true) && (obj_arbol_de_navidad.Aregalo = 0) && (obj_arbol_de_navidad.Txtarb = 0)) { obj_prota.stop = false; instance_destroy(); canskip = false}
       
       if (indice > 6) { obj_prota.stop = false; instance_destroy(); canskip = false;  obj_arbol_de_navidad.Aregalo = 1}
       
       if ((indice > 0) && (obj_arbol_de_navidad.Aregalo = 1)) {obj_prota.stop = false; instance_destroy();}
       
       mensaje = "";
       }else{
             mensaje = referencia.msg[indice];
       }
}


///coloca el cuadro de texto en la parte inferior de la pantalla
x = __view_get( e__VW.XView, 0 )+0;
y = __view_get( e__VW.YView, 0 )+176;

Necesito ayuda, es bastante extraño que suceda esto, ya probe cambiando el step por begin step o un end step, pero nada :/ si alguien tiene idea de lo que sucede se lo agradeceria mucho :3
« última modificación: Enero 13, 2021, 07:40:48 pm por Alemar5 »

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado dixon

Respuesta #1 en: Enero 11, 2021, 02:41:31 am
Hola saludos cordiales

En el evento step tienes un problema visible, dices que la condicion se cumple si induce<=Referencia final. Y ESO impide que indice supere a LA referencia final para poder destruir LA inatancia.. Intents con indice<=referencia.final+1.…

Bueno' intents e informa

Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.
 
Los siguientes usuarios dieron las gracias a este tema: Alemar5


Desconectado Alemar5

  • Habitual
  • *
  • Puntos: 65
  • Mensajes: 31
  • Sexo: Masculino
    • Ver Perfil
Respuesta #2 en: Enero 11, 2021, 05:53:34 pm
Hola amigo, gracias por la respuesta, ya tinente agregarle +1 a la referencia.final, sin embargo continúa dando el mismo problema...

Este es el codigo modificado:

/// @description  preciona enter y cambia de dialogo
if keyboard_check_pressed(ord("X")) and indice <= referencia.final+1{
   if (mensaje == referencia.msg[indice]){
       indice += 1;
       global.mensaje += 1;
       if (indice > referencia.final) { obj_prota.stop = false; instance_destroy(); }
       mensaje = "";
       }else{
             mensaje = referencia.msg[indice];
       }
}

///coloca el cuadro de texto en la parte inferior de la pantalla
x = __view_get( e__VW.XView, 0 )+0;
y = __view_get( e__VW.YView, 0 )+176;


 


Desconectado dixon

Respuesta #3 en: Enero 11, 2021, 08:27:41 pm

Segun lo que entiendo, el problema es que no se destruyen las instancias... Y las cuatro líneas que destruyen instancias son las siguientes:

Evento step:
if (indice > referencia.final) { obj_prota.stop = false; instance_destroy(); }

Evento step de textbox...
if ((indice > 3) && (canskip = true) && (obj_arbol_de_navidad.Aregalo = 0) && (obj_arbol_de_navidad.Txtarb = 0)) { obj_prota.stop = false; instance_destroy(); canskip = false}
if (indice > 6) { obj_prota.stop = false; instance_destroy(); canskip = false;  obj_arbol_de_navidad.Aregalo = 1}   
if ((indice > 0) && (obj_arbol_de_navidad.Aregalo = 1)) {obj_prota.stop = false; instance_destroy();}
     
Crea una copia del proyecto e intenta con esta modificadcion

Para el step: lo modificado es el if indice > referencia.final-1

/// @description  preciona enter y cambia de dialogo
if keyboard_check_pressed(ord("X")) and indice <= referencia.final+1{
   if (mensaje == referencia.msg[indice]){
       indice += 1;
       global.mensaje += 1;
       if (indice > referencia.final-1) { obj_prota.stop = false; instance_destroy(); }
       mensaje = "";
       }else{
             mensaje = referencia.msg[indice];
       }
}

///coloca el cuadro de texto en la parte inferior de la pantalla
x = __view_get( e__VW.XView, 0 )+0;
y = __view_get( e__VW.YView, 0 )+176;

De no funcionar responde a estas preguntas:

1.¿cuando debe destruirse la instancia? creo que hay muchas causas diferentes.
2.¿cuando falla?, y cual de las lineas de destruccion si esta funcionando. Con esto descartamos líneas.



Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.
 
Los siguientes usuarios dieron las gracias a este tema: Alemar5


Desconectado Alemar5

  • Habitual
  • *
  • Puntos: 65
  • Mensajes: 31
  • Sexo: Masculino
    • Ver Perfil
Respuesta #4 en: Enero 12, 2021, 02:56:18 am
Un saludo, estuve tratando de resolver el problema con la informacion que me diste, sin embargo continua sin funcionar.

Respondiendo a las preguntas...

¿cuando debe destruirse la instancia? La instancia deberia destruirse cuando el indice sea mayor que la referencia final, el cual esta especificado en el objeto refrigerador como numero 6.

¿cuando falla? Falla justamente en el final del texto, cuando se supone que deberia destruirse este vuelve a empezar, creando un bucle infinito.

esto solo sucede si uso una copia IDENTICA del objeto textbox, lo cual me extraña suponiendo que es el mismo codigo, te adjuntare un video para que puedas apreciar el codigo con mas detalle.

(de antemano gracias por la ayuda :3)

Link: (revisa las marcas de tiempo)

https://www.youtube.com/watch?v=WqENSEZkSrE&feature=youtu.be

 


Desconectado dixon

Respuesta #5 en: Enero 12, 2021, 05:54:39 am
Hola

Creo engender que el objeto original textbox no esta fallando, solo esta fallando una copia que has creado del mismo. ???

Los cambis entonces se los haras a LA copia y no al original. ESO es lo que entiendo.

Ai LA instancia debe destruirse cuando el induce sea mayor que LA referencia entonces pieces extraer ESE pequeño codio y hacerlo independiente del conjunto completo.. Dejame explicar..

1. LA instancia debe destruirse cuando el indice sea mayor a la referencia final.
2. Eso es esto: if (indice > referencia.final) { obj_prota.stop = false; instance_destroy(); }
3. El indice no esta llegando a ser superior o no she esta ejecutando el codigo completo.
4. ESA linear de codigo puede estar sola end el even to step y no deberia afectar end Nada.
5. Es decir fuera del conjunto del codigo.

Vamos a USAR el show_message("indice: "+string()) para que nos indique si el indice esta llegando a see igual a la referencia

 /// @description  preciona enter y cambia de dialogo
if keyboard_check_pressed(ord("X")) and indice <= referencia.final+1{
   if (mensaje == referencia.msg[indice]){
       indice += 1;
       global.mensaje += 1;
if (indice = referencia.final) {show_message("indice: "+string(indice))}
       if (indice > referencia.final-1) { obj_prota.stop = false; instance_destroy(); }
       mensaje = "";
       }else{
             mensaje = referencia.msg[indice];
       }
}

///coloca el cuadro de texto en la parte inferior de la pantalla
x = __view_get( e__VW.XView, 0 )+0;
y = __view_get( e__VW.YView, 0 )+176;  



Este codigo es para la copia del textbox. Con esto verificaremos so indice llega a ser igual a la referencia...

So aparece el mensaje entonces ai llega a ser igual... Entonces debes modificarlo por
Indice>referencia.final para comprobar que este no she esta ejecutando..

Pero si en la modificacion llega a aparecer el mensaje, entonces el problems puede see que seesta mandando a destruir all objeto original. Quizas.




Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.
 
Los siguientes usuarios dieron las gracias a este tema: Alemar5


Desconectado Alemar5

  • Habitual
  • *
  • Puntos: 65
  • Mensajes: 31
  • Sexo: Masculino
    • Ver Perfil
Respuesta #6 en: Enero 12, 2021, 10:01:10 pm
Ya intente cambiar el codigo y me aparece que el indice es igual a 7, por tanto es correcto, cuando cierro el mensaje el juego continua naturalmente destruyendo la instancia hasta que sea llamada nuevamente.

por tanto podria decirse que el codigo falla al llegar a:

{obj_prota.stop = false; instance_destroy();}

parece que se ejecuta antes el objeto prota.stop como true antes de destruir la instancia y se repite eternamente, sin embargo trate de cambiarlo a:

{ instance_destroy(); obj_prota.stop = false; }

pero sigue fallando, la cosa es que si se ejecuta el prota.stop como true antes de destruir la instancia se repetirá infinitamente, pero como es posible que siendo exactamente codigos iguales, literalmente una copia esten fallando de esta manera?

Agradezco mucho tu ayuda :3

 


Desconectado dixon

Respuesta #7 en: Enero 12, 2021, 11:40:22 pm
Lo que puedo imaginar es que no se está ejecutando instance_destroy(); porque como es una copia del objeto no está mandándose a destruir ella misma sino que está mandando a destruir al objeto original.

Puedes intentar cambiando esa fracción de código agragandole id.
 id.instance_destroy();
a ver si no te da error.
o con with
with (id){instance_destroy()}
queria algo asi

Cambiando a id.instance_destroy()
/// @description  preciona enter y cambia de dialogo
if keyboard_check_pressed(ord("X")) and indice <= referencia.final{
   if (mensaje == referencia.msg[indice]){
       indice += 1;
       global.mensaje += 1;
       if (indice > referencia.final) { obj_prota.stop = false; id.instance_destroy(); }
       mensaje = "";
       }else{
             mensaje = referencia.msg[indice];
       }
}

///coloca el cuadro de texto en la parte inferior de la pantalla
x = __view_get( e__VW.XView, 0 )+0;
y = __view_get( e__VW.YView, 0 )+176;


Y con with (id){instance_destroy()}

/// @description  preciona enter y cambia de dialogo
if keyboard_check_pressed(ord("X")) and indice <= referencia.final{
   if (mensaje == referencia.msg[indice]){
       indice += 1;
       global.mensaje += 1;
       if (indice > referencia.final) { obj_prota.stop = false; with(id){instance_destroy();} }
       mensaje = "";
       }else{
             mensaje = referencia.msg[indice];
       }
}

///coloca el cuadro de texto en la parte inferior de la pantalla
x = __view_get( e__VW.XView, 0 )+0;
y = __view_get( e__VW.YView, 0 )+176;

Tienes estos dos códigos para seguir probando.   
De no funcionar ahora emplea  esto: otro show_message("") de esta manera
show_message("si se ejecuta y obj_prota.stop es: "+string(obj_prota.stop))

Recueda que estamos utilizando el código original.
/// @description  preciona enter y cambia de dialogo
if keyboard_check_pressed(ord("X")) and indice <= referencia.final{
   if (mensaje == referencia.msg[indice]){
       indice += 1;
       global.mensaje += 1;
       if (indice > referencia.final) { obj_prota.stop = false;  instance_destroy(); show_message("si se ejecuta y obj_prota.stop es: "+string(obj_prota.stop)) }
       mensaje = "";
       }else{
             mensaje = referencia.msg[indice];
       }
}

///coloca el cuadro de texto en la parte inferior de la pantalla
x = __view_get( e__VW.XView, 0 )+0;
y = __view_get( e__VW.YView, 0 )+176;


Si ejecutas el ultimo código podrás tener dos respuestas:

1.   Que si aparezca el mensaje "si estas ejecutando y prota stop es: true o false"
2.   Y el otro caso que no te aparezca el mensaje y se vuelva a iniciar el mensaje.
Ahora

1.Si te apare el mensaje: el código  anterior esta bueno y instance_destroy(); no se esta ejecutando adecuadamente.
2. Si no te aparece el mensaje entonces el código anterior original debe ser cambiado denuevo.
Vamos a intentar esta otra cosa si aparece el mensaje, pues se supone que no se esta ejecutando el instance_destroy();
Vamos a introducir instance_destroy() en otro momento, cuando el índice sea 5, de la siguiente manera.

/// @description  preciona enter y cambia de dialogo
if keyboard_check_pressed(ord("X")) and indice <= referencia.final{
   if (mensaje == referencia.msg[indice]){
       indice += 1;
       global.mensaje += 1;
    if(indice = 5)
    {
    show_message("índice: "+string(indice)+"; si se ejecuta la destruccion")
    instance_destroy()
    }
       if (indice > referencia.final) { obj_prota.stop = false; id.instance_destroy(); }
       mensaje = "";
       }else{
             mensaje = referencia.msg[indice];
       }
}

///coloca el cuadro de texto en la parte inferior de la pantalla
x = __view_get( e__VW.XView, 0 )+0;
y = __view_get( e__VW.YView, 0 )+176;

Si aparece el mensaje y no se destruye la instancia, tienes que colocar instance_destroy() en esta otra posición para verificar que no se destruye.

/// @description  preciona enter y cambia de dialogo
if keyboard_check_pressed(ord("X")) and indice <= referencia.final{
   if (mensaje == referencia.msg[indice]){
    instance_destroy()//aqui es colocado instance destroy
       indice += 1;
       global.mensaje += 1;
       if (indice > referencia.final) { obj_prota.stop = false; instance_destroy(); }
       mensaje = "";
       }else{
             mensaje = referencia.msg[indice];
       }
}

///coloca el cuadro de texto en la parte inferior de la pantalla
x = __view_get( e__VW.XView, 0 )+0;
y = __view_get( e__VW.YView, 0 )+176;

Si se destruye la instancia, el problema puede estar en otro código, pero si no se destruye entonces simplemente no será destruida nunca de esa manera.

Tienes que tomar notas de todos estos experimentos para que me indiques como va evolucionando el problema. De esta forma podré entender mejo el sistema y lograremos hallar la solución, pero toma notas, muchos datos e informa paso a paso.

Si de ningún modo es destruida la instancia, entonces tendras que destruirla desde otro objeto, mandando su id y la orden de destrucción en una variable global, el objeto que la destruirá debe recibir la id y la orden de destrucción y ejecutar la destrucción de la instancia por medio de su  id.

¿Por qué puede estar sucediendo esto? A medida que game maker ha evolucionado ha aparecido errores e incongruencias en los códigos, no hay que asombrarse cuando se presentan estos errores, muchas veces pueden aparecer, ya he visto problemas similares entre códigos que parecen buenos pero que game maker no puede interpretar correctamente, estos casos los he visto cuando exporto a html5 con game maker html5 o studio 1.4. hay otros errores mas fuertes que no te permiten seguir ejecutando el juego y no te reportan el error, por lo tanto te dejan a ciegas y no se puede entender fácilmente lo que esta pasando. Por lo tanto para estos y los casos más difíciles hay que utilizar mucho el show_message(“”) e ir verificando los valores de las variables una por una para poder entender el origen del problema, y aun asi muchas veces he encontrado que el origen se escapa de mis manos y pertenece a un problema de game maker, entonces no me ha quedado otra que emplear otros codigos que logren el mismo objetivo.


Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.
 
Los siguientes usuarios dieron las gracias a este tema: Alemar5


Desconectado Alemar5

  • Habitual
  • *
  • Puntos: 65
  • Mensajes: 31
  • Sexo: Masculino
    • Ver Perfil
Respuesta #8 en: Enero 13, 2021, 07:40:15 pm
Hola amigo :D, quiero decirte que utilice tus codigos para comprobar las variables y todas parecian estar funcionando :c

entonces me las ingenie para crear este codigo con un nuevo objeto:

TEXTBOX_REFRIGERADOR
[step]

/// @description  preciona enter y cambia de dialogo
if keyboard_check_pressed(ord("X")) and indice <= referencia.final{
   if (mensaje == referencia.msg[indice]){
       indice += 1;
       global.mensaje += 1;
if (indice = 7) { instance_create(x,y,obj_controlador_stop); instance_destroy();  }

       mensaje = "";
       }else{
             mensaje = referencia.msg[indice];
       }
}

///coloca el cuadro de texto en la parte inferior de la pantalla
x = __view_get( e__VW.XView, 0 )+0;
y = __view_get( e__VW.YView, 0 )+176;

OBJ_CONTROLADOR_STOP

if !(instance_exists(obj_textbox_refrigerador)) {obj_prota.stop = false; instance_destroy();}

Realmente te agradezco mucho por tu ayuda, me ayudo muchisimo a resolver este problema de las variables, enserio, mil gracias :3