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: ¿Diferencia entre hacer DRAW con un "for" y DRAW con variable que se incrementa?  (Leído 495 veces)

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

Desconectado renrojo

  • Visitante
  • *
  • Puntos: 10
  • Mensajes: 4
    • Ver Perfil
Intenté hacer que un string se muestre letra por letra. La idea fue usar una variable que se va incrementado de a 0.5 hasta llegar a la longitud total del string, usándola juntó a string_copy para ir copiando los caracteres en otra variable y haciendo un draw de esa variable. Pero después pensé que podía usar un for y usar su índice "i" en el string_copy.
El resultado de lo último: La string no se muestra letra por letra, sino que aparece completamente y varias veces en el mismo lugar (Superpuestas. El efecto es como el de una fuente en "negrita").
Recurrí a la primera solución que se me había ocurrido; es decir, usar una variable de instancia definida en el evento create, y el problema se solucionó.
Sin embargo, no veo la diferencia entre hacer una cosa y la otra. ¿Alguien podría explicármelo? Soy nuevo en GML.

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado BssString

Hola renrojo

La diferencia es que el ciclo "for" ocurre de principio a fin en el mismo Step, por eso ves la string dibujada completa, porque el "for" llega hasta el final del string en 1 Step.

La forma de usar una variable e incrementarla va a ser igual o diferente dependiendo de cómo incrementas la variable, si la incrementas en el Step Event o en el Draw Event 1 vez por Step, entonces ahí sí lograrás el efecto que buscas y verás que la string se va dibujando letra por letra. Porque cada 2 steps te dibujará la letra que sigue en vez de TODO en el mismo step.

De hecho lo que pienso que te pasó en el ciclo "for" es que si tu string mide 10 carácteres, el ciclo for te hace 10 dibujos al mismo tiempo.
Primero dibuja una letra, luego la primera y la segunda, luego la 1ra, 2da y 3ra, etc hasta dibujarlas todas, entonces las primeras letras se dibujan varias veces en el mismo step, por eso las ves en Negrita.

Saludos

 
Los siguientes usuarios dieron las gracias a este tema: renrojo


Desconectado renrojo

  • Visitante
  • *
  • Puntos: 10
  • Mensajes: 4
    • Ver Perfil
Hola renrojo

La diferencia es que el ciclo "for" ocurre de principio a fin en el mismo Step, por eso ves la string dibujada completa, porque el "for" llega hasta el final del string en 1 Step.

La forma de usar una variable e incrementarla va a ser igual o diferente dependiendo de cómo incrementas la variable, si la incrementas en el Step Event o en el Draw Event 1 vez por Step, entonces ahí sí lograrás el efecto que buscas y verás que la string se va dibujando letra por letra. Porque cada 2 steps te dibujará la letra que sigue en vez de TODO en el mismo step.

De hecho lo que pienso que te pasó en el ciclo "for" es que si tu string mide 10 carácteres, el ciclo for te hace 10 dibujos al mismo tiempo.
Primero dibuja una letra, luego la primera y la segunda, luego la 1ra, 2da y 3ra, etc hasta dibujarlas todas, entonces las primeras letras se dibujan varias veces en el mismo step, por eso las ves en Negrita.

Saludos

Buen día, muchas gracias por tu respuesta tan rápida.
Mi conclusión de lo que pasó con el for es exactamente lo que describís, pero sigo sin entender cómo funciona el evento Draw. ¿No debería suceder lo mismo en el caso solución? Lo digo, sobre todo, por la forma que tiene la instrucción string_copy, que requiere un parámetro para indicarle desde dónde debe empezar a copiar el texto, y al que yo determiné "1":
-En la primera ejecución del evento, copia los caracteres desde 1 hasta N (ejemplo: N=2) y los imprime en pantalla.
-En la tercera ejecución (N=3) vuelve a copiar desde 1 hasta N e imprimir el mismo string otra vez, pero con una letra más.
Sin embargo, no aparenta ser lo que está sucediendo. Se ve bien y no superpuesto. ¿Cómo hace Game Maker para saber que ya no debe mostrar los caracteres anteriores? ¿El evento Draw omite instrucciones o partes de instrucciones "draw_" que ya fueron ejecutadas previamente?

Edito: Investigando un poco, descubrí que el evento Draw limpia la pantalla antes de volver a dibujar en cada una de sus ejecuciones, así que mi respuesta puede estar ahí.
« última modificación: Diciembre 06, 2019, 02:42:00 pm por renrojo »

 


Desconectado Black_Cat

Lo que pasa es que en el caso solucion, la funcion dibuja una sola cadena, que es la que se está añadiendo caracter por caracter. Se limpia la pantalla y pasa al siguiente step.
Se dibuja un caracter mas, pero sigue siendo una sola cadena. Se limpia la pantalla y pasa al siguiente step, asi consecutivamente.

En el caso del for, dependiendo de cuantos ciclos haga el for, se va a ejecutar N veces por step. Por lo que si tenés un draw_string dentro del for, se va a dibujar N veces la misma cadena por step, lo cual desemboca en el efecto ese de negrita. Porque son muchos dibujos superpuestos.


 
Los siguientes usuarios dieron las gracias a este tema: renrojo


Desconectado renrojo

  • Visitante
  • *
  • Puntos: 10
  • Mensajes: 4
    • Ver Perfil
Lo que pasa es que en el caso solucion, la funcion dibuja una sola cadena, que es la que se está añadiendo caracter por caracter. Se limpia la pantalla y pasa al siguiente step.
Se dibuja un caracter mas, pero sigue siendo una sola cadena. Se limpia la pantalla y pasa al siguiente step, asi consecutivamente.

En el caso del for, dependiendo de cuantos ciclos haga el for, se va a ejecutar N veces por step. Por lo que si tenés un draw_string dentro del for, se va a dibujar N veces la misma cadena por step, lo cual desemboca en el efecto ese de negrita. Porque son muchos dibujos superpuestos.

Excelentes sus respuestas, fueron muy amables.
¡Muchas gracias! :)