No queria postear esto para no molestar por un problema seguramente idiota... pero no se que pasa.
Tengo un objeto (En), al dispararle debe envenenarse por un maximo de 3 segundos, siendo posible tener dos niveles de veneno diferentes.
En su create event tiene
p1_time = 0 //tiempo en que tiene veneno nivel 1
p2_time = 0 //tiempo en que tiene veneno nivel 2
Al colisionar con otro objeto, un dardo.
if p1_time<=90
{p1_time=90}//Queda envenenado por 3 segundos con veneno nivel 1
Y en su step event
if !p1_time=0
{p1_time-=1}
if !p2_time=0
{p2_time-=1}
if p1_time>=1 and p2_time=0//Calcula el daño, da prioridad al veneno level 2. Si el 2 se acaba antes que el 1, el 1 debe seguir dañando
{hp-=0.16}
if p2_time>=1
{hp-=0.24}
En principio funciona. Lo envenena, y disminuye su hp. Pero despues de unos segundos, mientras sigue envenenado, o cuando ya se termino el tiempo del veneno, o cuando lo vuelven a envenenar, aleatoreamente, me sale el error:
___________________________________________
ERROR in
action number 1
of Step Event
for object En:
Error in code at line 8:
if !p1_time=0
^
at position 6: Unknown variable p1_time
___________________________________________
Abriendolo en el debug mode, mientras sucede veo que el objeto (En) nunca pierde el valor de la variable p1_time.
Espero puedan ayudarme, desde ya gracias!
Mmm. ¿En palabras coloquiales, qué quieres hacer con esto?
if !p1_time=0
GML es un lenguaje muy permisivo en ciertas cosas. Alevaluar una condición, a= b no es lo mismo que a == b
Cita de: penumbra en Febrero 24, 2013, 08:28:40 PM
Mmm. ¿En palabras coloquiales, qué quieres hacer con esto?
if !p1_time=0
GML es un lenguaje muy permisivo en ciertas cosas. Alevaluar una condición, a= b no es lo mismo que a == b
Quise expresar siempre que el valor no sea 0, en este caso solo dejara de ser 0 si es un numero mayor. Para que reste 1 hasta llegar a 0.
Entiendo que al poner if a=b, lo compara.
De todas maneras el codigo tambien lo habia probado con
if p1_time>=1
y pasaba exactamente lo mismo. Lo cambie a !p1_time=0 pq era mas corto jaja
CitarEntiendo que al poner if a=b, lo compara.
Precísamente. a = b no es una comparación, es una asignación. Una comparación es a == b. Puedes usar
If !(p_time == 0) "Si p_time no es cero" (Puede ser cualquier un numero positivo o negativo)
aunque a mi me gusta más
If (p_time > 0). "Si p_time es al menos 1"
Lo mismo pasa en if p1_time>=1 and p2_time=0 debería ser if (p1_time>=1) and (p2_time
== 0).
Bueno, eso en cuanto a la sintáxis, pero no sé si esto solucione tu problema. Según tu mensaje de error, la falla está en la línea 8 del evento Step, pero en el código que pegaste, la instrucción if !p1_time=0 no está en la línea 8.
Cita de: penumbra en Febrero 24, 2013, 09:47:04 PM
Precísamente. a = b no es una comparación, es una asignación. Una comparación es a == b. Puedes usar
Tenia entendido que en lenguaje de gm, al poner el if detras era exactamente lo mismo y comparaba. Pero todos los dias se aprende algo nuevo jaja. modifique los signos para que compare propiamente. Pero pasa lo mismo u.u
Cita de: penumbra en Febrero 24, 2013, 09:47:04 PM
Según tu mensaje de error, la falla está en la línea 8 del evento Step, pero en el código que pegaste, la instrucción if !p1_time=0 no está en la línea 8.
Si, en realidad el codigo arriba tiene otras cosas, pero no esta relacionado con esto, y en ningun momento usa estas variables.
El tema es que de todas maneras el codigo funciona. Empieza funcionando a la perfeccion pero desps como que "pierde" el valor de esa variable. Dice que no la reconoce, siendo que en sus variables locales sigue marcando el valor y se modifica en cada step. Eso me frustra ._.
A mi me pasó algo similar hace un tiempo. En el debugger me aparecía una variable con su valor correcto, pero GM me mandaba el mismo error de variable desconocida.
Pareciera como si en tu código en algún lugar se crearan o borraran instancias del objeto En.
Prueba esto. Todo el código de STEP que pusiste en el primer post, mételo dentro de esto
if instance_exists(En)
{
Aquí tu código
}
Hmmm... no entendi a que te referis. El codigo esta en el evento Step del objeto En. Es decir que si el codigo se esta ejecutando si o si va a existir.
Aun asi lo probé y desgraciadamente no hay diferencia.
Eso sí está raro. Sin ver todo el código no se me ocurre algo más.
¿Y si en STEP quitas la primera condición para ver si da el mismo error con p2_time?
Esto no tiene mucho que ver, pero en el código de la colisión, puedes quitar if p1_time<=90 ya que me imagino que siempre que toque un dardo, el tiempo comienza desde 90 hasta 0, sin importar si antes ya había sido tocado por otro dardo.
Cita de: penumbra en Febrero 24, 2013, 11:12:38 PM
¿Y si en STEP quitas la primera condición para ver si da el mismo error con p2_time?
Acabo de probar, y salta el mismo error con el p2_time. Dice unknown variable tmb.
Cita de: penumbra en Febrero 24, 2013, 11:12:38 PM
Esto no tiene mucho que ver, pero en el código de la colisión, puedes quitar if p1_time<=90 ya que me imagino que siempre que toque un dardo, el tiempo comienza desde 90 hasta 0, sin importar si antes ya había sido tocado por otro dardo.
Eso era por si en el futuro decidia agregar algun tipo de dardo que pueda enenenar por mas de 3 segundos, para que no lo reduzca. Pero si, por el momento es igual ponerlo como decis
Cita de: penumbra en Febrero 24, 2013, 11:12:38 PM
Eso sí está raro. Sin ver todo el código no se me ocurre algo más.
Muy raro. Realmente lo reviso una y otra vez, pero no le encuentro sentido. Pasaria todos los codigos, pero realmente no estan relacionados en lo mas minimo. Esta variable acabo de crearla y solo hice la interaccion entre esos tres eventos.
Recien para confirmar si aun tenia el valor de la variable puse en el evento Draw, que dibuje el numero del valor p1_time. Lo hace, el numero cambia con cada step. Incluso sigue marcando el valor cuando sale el error. Si pongo ignore (que permite hacer otro step antes de que vuelva a surgir el error) el valor disminuye. Es decir que incluso desps del error, sigue ejecutando el codigo:
if p1_time>0
{p1_time-=1}
Woo esta arreglado!
Habia un objeto con un nombre distinto que tenia a En de parent. Ese objeto tenia un create event distinto y la variable no la tenia incorporada. El error surgia cando ese objeto se creaba, y no me daba cuenta pq en el error me decia que estaba relacionado al objeto En. Disculpas por las molestias, como habia dicho al principio era un problema idiota. Gracias por la ayuda de todas maneras, aprendi una que otra cosa
Uff. Qué bueno que se solucionó. Yo ya iba a decirte que cambiaras el proceso de envenenamiento de En al objeto dardo.
Esto tambien pasa por hacer todo en la mente (me incluyo). Con el uso de un documento de diseño bien hecho, sería más fácil detectar el origen de estas fallas.