Julio 26, 2011, 10:01:49 AM Ultima modificación: Julio 26, 2011, 10:03:40 AM por klys
Estando una variable correctamente en el evento de creacion del objeto, y luego usandola en otro evento del mismo objecto incurre en este raro error que solo eh podido resolver con la siguiente condicion en el evento donde ocurre el error:

[gml]if (variable_local_exists('Variable_Con_Error')==false) Variable_Con_Error=1[/gml]

Seria bueno si alguien mas tuvo este error, si encontro alguna mejor forma de resolverlo, alguna forma que sea definitiva, y asi me libre de la calamidad de esa condicion, que no me gusta para nada porque no deberia ser necesaria para este caso.

Un detalle que a lo mejor influya en este bug es que en el objeto donde ocurre el error en el evento de creacion se crean objetos childs, o tambien que es parent de varios otros objetos...

Nose precisamente la raiz del bug, seguire experimentando.

Uso: 8.0 (no 8.1)
Battlefield Galactic (Nombre piloto) Alpha 1.7.5.0
Juego Genero: Multiplayer Online Battle Arena!
Is more than 9000 APM!!

Ese error suele ser porque algun otro objeto quiere acceder a la variable antes de que el objeto con dicha variable se halla inizializado (creado) es decir creas el objeto y directamente intentas acceder a sus variables.
Tambien pasa que los objetos estan en la room, y segun en que orden los pones los eventos de create se ejecutan en un orden y si uno aun no se ha "creado" no se puede acceder a sus variables.

A mi pasaba tambien xD

Oh, ya entiendo...
...no, espera. Te refieres a que un objeto accede a una variable de un objeto que no existe, al igual que la variable que tampoco existe??? Bueno, eso explica porque a veces cuando modifico partes de mi juego y cargo la partida en la que estaba antes de modificarlo, aparecia este error.
Tambien tiene que ver con esto, no???


Claro, ese error tambien ocurre en esos casos, pero mi caso es un caso "bug de game maker", encontre la razon!

La razon de este bug y lo probablemente lo pueden reproducir y verificar es que cuando un objeto es parent (ojo, que es parent, no que tiene parent (child)) su create event al parecer falla en inicializar variables.

A todos los child del objeto donde ocurria este error les quite el parent y viola, adios bug.

Otro detalle:
El evento donde estoy llamando el uso de la variable, que incurria en el error, esta en un evento del mismo objeto donde fallaba en la creacion de la variable.
Battlefield Galactic (Nombre piloto) Alpha 1.7.5.0
Juego Genero: Multiplayer Online Battle Arena!
Is more than 9000 APM!!

Pues es obvio que un parent no tiene que tener un create. Ahora entiendo porque todos mis parents no tiene create. Es algo raro, pero muy cierto: no creas el parent, ni las variables del parent, pues solo es un comparativo...
...no se si me entiendas. XD
No puede tomar una variable de un parent porque no existe, solo es para juntar algunos objetos del mismo tipo.
O algo asi XD.


#5 Julio 26, 2011, 06:30:09 PM Ultima modificación: Julio 26, 2011, 06:34:28 PM por klys
El parent si se crea en si xd, el problema esta nada mas en la declaracion de variables en el evento de creacion del objeto parent, porque eh usando var = instance_create y esas variables si son validas, es bastante raro.

Segun lo que dices, los parent solo sirven para juntar objetos del mismo tipo? ... Eso supuse hacia... Pero que se anule la creacion de variables, no lo entiendo, lo buscare en la wiki de yoyogames a ver como funcionan los parent y asi eliminamos esta caja negra.

____________EDIT_______________________

Segun lo que dice http://wiki.yoyogames.com/index.php/Object_set_parent

Un parent es un objeto que le dara todos sus eventos a sus hijos. Practicamente con herencia, algo bien conocido por la POO.

Por eso al llamar el evento del parent ocurria ese error de "Unknow variable", porque la variable no la tiene el parent, sino sus hijos.

lol.
Battlefield Galactic (Nombre piloto) Alpha 1.7.5.0
Juego Genero: Multiplayer Online Battle Arena!
Is more than 9000 APM!!

Ah!!!
Hmmm!!!
Que cosas, no??? XD
Bastante raro, debo admitirlo. La variable no la tendr?n los parent, sino sus hijos (que termino XD). Es raro, pero bastante logico, asi como en la vida real con la herencia genetica y todo eso.
Hmm, esto me queda aun mas claro...


He tratado de reproducir el error, cree un objeto y le puse un evento create donde declare dos variables y otro evento donde debe utilizarlas.

Luego cree otro objeto y le asigne el primero como parent.

Ambos funcionaron sin ningun problema, tanto por separados como al ponerlos juntos.

Si pudieras especificar m?s como reproducir el problema, o pasar un editable donde se presente seria mejor, ya que yo nunca he tenido problemas usando parents.

P.D. Cuando dice que el parent da sus eventos a sus hijos no quiere decir que el parent se quede sin sus respectivos eventos, la herencia lo que hace es que los eventos que tiene el parent los tengan los hijos, en tanto ese evento no sea sobreescrito.

Si quieres que la variables que detecten este error se designen solas un "0" puedes activar la opcion: "Treat uninitialized variables as value 0" en la pesta?a "Errors" de las "Global options" del juego.

#9 Julio 27, 2011, 03:17:16 AM Ultima modificación: Julio 27, 2011, 03:20:15 AM por Wadk
A ver, que andamos mal con la programaci?n orientada a objetos.
Si declar?s una variable en create de un objeto, la variable es del objeto y solo del objeto, sin importar si tiene parent o si es parent.
Por otro lado si un objeto sin evento create tiene un parent que declara una variable en create, el objeto hereda el evento create del parent (ya que ?l no tiene), y por lo tanto hereda tamibi?n la variable. Si el objeto tiene un parent que declara una variable en create, pero tiene tambi?n evento create, el objeto no hereda el evento del parent, y por lo tanto no hereda la variable. En ese caso, para que herede el create del padre y lo ejecute junto con su propio create, se usa la funci?n event_inherited().

Es posible que, cualquiera sea el error que estuviste experimentando, tenga que ver con lo que acabo de explicar.

Por cierto...
Cita de: MaanuRP en Julio 26, 2011, 10:25:29 PM
Si quieres que la variables que detecten este error se designen solas un "0" puedes activar la opcion: "Treat uninitialized variables as value 0" en la pesta?a "Errors" de las "Global options" del juego.
Mala, muy mala idea.
Vim.

Wadk, aclare que la idea solo sirve si TODAS las variables que vaya a usar en el juego empezaran siendo 0, si es asi no es una mala idea.

Si todas las variables son 0 cuando empiezan, porque es mala idea?

(No es una pregunta retorica, pregunto porque estoy seguro que sabes mas que yo y que si estoy equivocado me vas a corregir :) )

Cita de: MaanuRP en Julio 27, 2011, 03:36:14 AM
Wadk, aclare que la idea solo sirve si TODAS las variables que vaya a usar en el juego empezaran siendo 0, si es asi no es una mala idea.

Si todas las variables son 0 cuando empiezan, porque es mala idea?

(No es una pregunta retorica, pregunto porque estoy seguro que sabes mas que yo y que si estoy equivocado me vas a corregir :) )
Simplemente porque trae un sinf?n de problemas y puede causar bugs muy jodidos y dif?ciles de encontrar y arreglar.
Vim.

Cita de: Wadk en Julio 27, 2011, 04:37:34 AM
Cita de: MaanuRP en Julio 27, 2011, 03:36:14 AM
Wadk, aclare que la idea solo sirve si TODAS las variables que vaya a usar en el juego empezaran siendo 0, si es asi no es una mala idea.

Si todas las variables son 0 cuando empiezan, porque es mala idea?

(No es una pregunta retorica, pregunto porque estoy seguro que sabes mas que yo y que si estoy equivocado me vas a corregir :) )
Simplemente porque trae un sinf?n de problemas y puede causar bugs muy jodidos y dif?ciles de encontrar y arreglar.

Pero porque? Si lo unico que hace eso es identificar las variables como 0 si fueran a dar el error de que la variable no exista.
Si TODAS las variables de tu juego apenas se crean fueran 0 con o sin esa opcion tildada, cual es el problema?

PD: Insisto, al preguntar no te quiero contradecir ni faltar el respeto, solo pregunto porque me parece raro que hayan puesto en el software una opcion que es muy mala idea activarla.

Imagina un c?digo que acabas de programar, un c?digo muy extenso y muy importante, con varias variables.

Ahora imagina que cuando estabas programandolo diste un teclazo accidental y escribiste mal alguna variable.

Gracias a ese teclazo y a la opcion de declarar variables automaticamente ahora tienes una variable extra en alguna parte, cuyo valor esta siendo cambiado o comprobado en lugar de la variable correcta.

Ese solo error te puede arruinar por completo el c?digo al alterar su comportamiento. Y un c?digo que se comporta inesperadamente tiende a ser m?s dificil de solucionar que un c?digo que simplemente te da error.

Por ejemplo, ya que la variable se declara a si misma y no te dar? un mensaje de error, existe la probabilidad de que no tengas la menor idea de donde esta el problema o como empezar a buscarlo, y es posible que a?n cuando leas y releas el c?digo no te des cuenta del problema.

Bueno, pero eso es si hay un error humano, yo cada vez que escribo el nombre de una variable me tomo el trabajo de ir al lugar donde se creo, seleccionar solo los caracteres necesarios, copiarlos y pegar el nombre de la variable donde debe ser, porque por mas que se escriba mal no te da error de sintaxis, por eso es un trabajo que hay que tomarse.
Total es el unico trabajo, ya que si te equivocas en una funcion o codigo, el programa si te detectara automaticamente que es un error.
Ademas apenas terminas el script o la parte del codigo debes revisar SIEMPRE las variables letra por letra para saber que estan bien escritas, eso lo se hasta yo que tengo muy poco en el Game  Maker y he trabajado con lenguajes que si te advierten de la variable mal escrita.

Ya si alguien escribe y solo se fia de la autocorreccion del editor de GML es otra cosa, ahi estamos hablando de un error humano, no de un error del software o de la opcion.