Marzo 03, 2015, 10:37:14 AM Ultima modificación: Marzo 04, 2015, 11:01:14 AM por Sockman
Buenas, a ver si me podéis echar una mano porque no doy con la solución. Estoy con  :GM8: y creo que lo puedo hacer con arrays, pero no me termino de aclarar.

Quiero crear una transición o cortinilla entre fases que llene la pantalla de cuadrados negros hasta dejarla negra completamente.
La view es de 400x400. Y los cuadrados negros de 20x20. Habría que generar 400 cuadrados con una determinada velocidad sin repetir posición, hasta que se llenara la view por completo.
Y luego en principio, sería el proceso contrario, ir eliminándolos hasta dejar la pantalla limpia.

La idea es terminar la fase. Empezar a llenar la view con cuadrados. Y cuando esté negra completamente cambiar de room, para luego ir limpiando la pantalla de cuadrados con la room nueva debajo.
Espero haberme explicado bien...



Yo te recomendaría que usaras un gif, crear tantos objetos no es bueno, hace que le baje performance a tu juego.

#2 Marzo 03, 2015, 06:49:54 PM Ultima modificación: Marzo 03, 2015, 06:58:36 PM por penumbra
Para llenar la pantalla en orden, a base de cuadros pequeños, se usarían ciclos anidados.
http://www.comunidadgm.org/preguntas-y-respuestas/dibujar-sprite-como-se-muetra-en-la-imagen/msg111761/#msg111761
http://www.comunidadgm.org/preguntas-y-respuestas/ayuda-corrigiendo-este-script/msg110944/#msg110944

pero como dijo Iros, no es muy eficiente llenar la pantalla de objetos. La alternativa que a mi me parece viable es en lugar de usar 200 objetos, usar sólo un sprite que se dibujaría (mediante los ciclos) en una superficie. Cuando se halla completado de dibujar los 200 cuadros en la superficie, la superficie se dibuja en draw. esto evitaría tener que crear objetos de manera innecesaria.

El uso de arreglos se adecua más para que los objetos se dibujen en orden, si quieres que los cuadros se dibujen desordenadamente (aleatoriamente), entonces a mi me parece que los arreglos no es lo más recomendable.Se puede probar a que los cuadros se dibujen aleatoriamente en cualquier posición dentro de la pantalla, pero no sé qué tanto tiempo tardaría en llenarse la pantalla, podría llenarse rápido o podría tardar mucho.

Otra estrategia es usar los objetos cuadrados que mencionas, crearlos al azar, pero al crear cada cuadro, que el cuadro revise si la posición está vacía. si no lo está, se movería hasta encontrar una posición vacía y esto haría que el tiempo en que se llena la pantalla fuera menor,

#3 Marzo 03, 2015, 07:09:23 PM Ultima modificación: Marzo 03, 2015, 07:13:42 PM por Clamud
Yo lo implementé usando una lista y tiles, en este caso las tiles convienen porque usan menos memoria y menos procesador que los objetos:
[gml]
///EVENTO CRAETE
global.l = ds_list_create(); //crear lista
for( i=0; i<400; i+=1 )
    ds_list_add( global.l, i ); //llenar con numeros desde 0 hasta 399
ds_list_shuffle( global.l ); //desordenar lista
i = 0; //contador de cuadros creados (se reutiliza la variable)
[/gml]
[gml]
///EVENTO STEP: Llenar pantalla de cuadros
if( i < 400 ) { //si no se ha llenado
    repeat( 2 ) { //crear 2 cuadros
        z = ds_list_find_value( global.l, i ); //obtener un numero al azar
        x = (z mod 20) * 20; //determinar una posicon a partir del numero
        y = (z div 20) * 20;
        tile_add( bgCuadro, 0,0, 20,20, x,y, -1000 ); //agregar cuadro
        i += 1; //incrementar contador
    }
}
else room_goto_next(); //si se ha llenado, ir a room siguiente
[/gml]
La velocidad de la transición se puede aumentar usando un número mayor en el ciclo repeat.
En el ejemplo adjunto he puesto también el efecto contrario; borrar los cuadros.

No seria mejor usar SURFACES?? Lo q pides es como una transicion entre rooms, entonces...
Es una idea, aun no sé usar bien los sufaces  :-X
- Empty -

#5 Marzo 03, 2015, 10:51:20 PM Ultima modificación: Marzo 03, 2015, 11:21:52 PM por Sockman
Cita de: Clamud en Marzo 03, 2015, 07:09:23 PM
Yo lo implementé usando una lista y tiles, en este caso las tiles convienen porque usan menos memoria y menos procesador que los objetos:
[gml]
///EVENTO CRAETE
global.l = ds_list_create(); //crear lista
for( i=0; i<400; i+=1 )
    ds_list_add( global.l, i ); //llenar con numeros desde 0 hasta 399
ds_list_shuffle( global.l ); //desordenar lista
i = 0; //contador de cuadros creados (se reutiliza la variable)
[/gml]
[gml]
///EVENTO STEP: Llenar pantalla de cuadros
if( i < 400 ) { //si no se ha llenado
    repeat( 2 ) { //crear 2 cuadros
        z = ds_list_find_value( global.l, i ); //obtener un numero al azar
        x = (z mod 20) * 20; //determinar una posicon a partir del numero
        y = (z div 20) * 20;
        tile_add( bgCuadro, 0,0, 20,20, x,y, -1000 ); //agregar cuadro
        i += 1; //incrementar contador
    }
}
else room_goto_next(); //si se ha llenado, ir a room siguiente
[/gml]
La velocidad de la transición se puede aumentar usando un número mayor en el ciclo repeat.
En el ejemplo adjunto he puesto también el efecto contrario; borrar los cuadros.

Increíble. Es justo lo que quería. Justamente estaba leyendo sobre las listas porque no las conocía.
Decirte que me ha venido al pelo y que funciona de maravilla.
Al final he agrupado todo en un mismo objeto persistente (la parte que borra los cuadrados la he puesto en el evento "room start")  que elimino junto con la lista cuando termina de limpiar la pantalla.

Tengo una duda. Lo entiendo en su mayoría, pero si no tienes inconveniente me gustaría que me aclararas esta parte:

Citarx = (z mod 20) * 20; //determinar una posicon a partir del numero
        y = (z div 20) * 20;

"mod" es el resto de la división ¿verdad?
Sé que es la parte más importante pero no consigo entenderla del todo.  :(

De todas formas, muchas gracias por tu ayuda. Subiré un gif para que veais el resultado.
Un saludo.


#6 Marzo 04, 2015, 12:33:53 AM Ultima modificación: Marzo 04, 2015, 12:35:37 AM por Clamud
Esta es la explicación. A cada cuadro dentro de la matriz de 20x20 se le asigna un número de esta forma:

se van numerando de izquierda a derecha y de arriba a abajo, desde 0 hasta 399. Los números que están en la fila superior y en la columna de la izquierda son las coordenadas de los cuadros dentro de la matriz. Como la numeración está ordenada, es fácil saber las coordenadas de un cuadro a partir de su número asignado, por ejemplo, si tomamos el cuadro 42, si dividimos a mano 42 entre 20 tendremos 2 como resultado entero y 2 como residuo, [2,2] son las coordenadas del cuadro dentro de la matriz, esos resultados se obtienen con los operadores "div" y "mod". Para obtener la posición real del cuadro en la room hay que multiplicar esas coordenadas por 20.