Hola amig@s.

Estoy liado con mi juego infantil para ejercitar la memoria de objetos, como explico en mi post Bitácoras

El caso es que no consigo que me funcione correctamente ningún código para hacer la primera parte del juego en si, no se como hacer que me cree una lista de las subimagenes de varios sprite (o uno) que quiero usar para cualquier nivel.

Necesito a mi entender conseguir hacer esto: (a no se claro, que sepan algún mejor planteamiento para conseguir mi objetivo)

[spoiler= Idea global de lo que necesito]// La 1ª imagen listada siempre sera la imagen correcta del nivel.
Indicar numero de imagenes: (Ej = 3)

Listar coordenadas disponibles: (Ej)   //La 1ª es la utilizada para la imagen sombra.
{640, 160}
{160, 480}
{480, 480}
{800, 480}

- Listar Sprites para el nivel:
{
   Sprite_Objestos
      [subimagenes (1, 3, 5-7)]
   Sprite_vehiculos
      [subimagenes (5-8, 10, 15)]
}

// Seleccionar sprites para cada imagen y Aleatorizar su posición.

Imagen 01.
   Seleccionar aleatoriamente un sprite de la lista.
           Borrar la entrada de ese sprite de la lista para que no pueda repetirse.
   Crear una instancia en las coordenadas (640, 160).
           Borrar coordenadas de la lista.
           Oscurecer instancia al negro opaco.
           Cambiar factor de escala (x,y = 1.5).
  Crear una instancia en las coordenadas aleatorias disponibles.
           Borrar coordenadas e la lista.
   
Imagen 02.
   Seleccionar aleatoriamente un sprite de la lista.
           Borrar la entrada de ese sprite de la lista para que no pueda repetirse.       
  Crear una instancia en las coordenadas aleatorias disponibles.
           Borrar coordenadas e la lista.

Imagen 03.
   Seleccionar aleatoriamente un sprite de la lista.
           Borrar la entrada de ese sprite de la lista para que no pueda repetirse.       
  Crear una instancia en las coordenadas aleatorias disponibles.
           Borrar coordenadas e la lista.
[/spoiler]


Alguien puede echarme una mano.

Hola.

Suponiendo que tienes 2 sprites con el mismo número de subimágenes, por ejemplo 10, creamos 2 listas de números ordenados de forma aleatoria:
[gml]
//Crear las listas
lista1 = ds_list_create();
lista2 = ds_list_create();

//Llenar las listas
for( i=0; i<10; i++ )
{
    ds_list_add( lista1, i );
    ds_list_add( lista2, i );
}

//Desordenar
ds_list_shuffle( lista1 );
ds_list_shuffle( lista2 );
[/gml]
Ahora suponemos que vamos a usar 6 subimágenes de esos 2 sprites, y las guardamos en un arreglo 2D:
[gml]
//Arreglo de subimágenes aleatorias
for( i=0; i<6; i++ )
{
    if choose( 0, 1 )
    {
        arreglo[i,0] = sprite1;
        arreglo[i,1] = ds_list_find_value( lista1, i );
    }
    else
    {
        arreglo[i,0] = sprite2;
        arreglo[i,1] = ds_list_find_value( lista2, i );
    }
}
[/gml]
Así obtenemos un arreglo con pares sprite-subimagen. Ahora hay que dibujar las imágenes de ese arreglo. Para no tener que predefinir las coordenadas de cada imagen, podemos definir cuántas se van a mostrar a lo ancho y cuántas a lo alto, y la distancia entre los orígenes de las imágenes. El total de imágenes ya estaba definido desde ántes:
[gml]
m = 3; //número de imágenes a lo ancho
n = 2; //número de imágenes a lo alto
sep = 100; //separación entre orígenes
tot = 6; //total de imágenes a mostrar

for( i=0; i<m; i++ )
{
    if( i+j >= tot ) break; //para no leer partes vacías del arreglo
    for( j=0; j<n; j++ )
    {
        if( i+j >= tot ) break;
        draw_sprite( arreglo[i+j,0], arreglo[i+j,1], i*sep, j*sep );
    }
}
[/gml]
En donde dice i*sep, j*sep vas a necesitar sumar otros valores para que la imágenes queden centradas en la pantalla.
Hace unos días que pensé en éste método pero se me olvidaba mostrarlo, ¿qué te parece?

#2 Noviembre 26, 2014, 08:34:13 PM Ultima modificación: Noviembre 26, 2014, 08:37:28 PM por carlymx
Hola Clamud..

Vaya Hacha estas hech@, brutal, que domino del código... yo estoy a años luz de algo así. aun que en realidad pueda en gran medida interpretar los códigos y también desarrollar ideas claras de lo que quiero, no se aplicar para escribir códigos correctos.

He aplicado tu código a mi room sobre un objeto nuevo y funciona, aun que me repite imágenes, no sabría hacer que no las repita.

El Codigo modificado para mis sprites no me da problemas, pero y si tengo 3 Sprites o más (como es mi caso), ¿como modificar el 'Arreglo'?

[spoiler=Código modificado]

//Llenar las listas
for( i=0; i<3; i++ )
{
    ds_list_add( lista2, i );
}

//Desordenar
ds_list_shuffle( lista1 );
ds_list_shuffle( lista2 );

//-----------------------------------//

//Arreglo de subimágenes aleatorias
for( i=0; i<6; i++ )
{
    if choose( 0, 1 )
    {
        arreglo[i,0] = spr_personajes;
        arreglo[i,1] = ds_list_find_value( lista1, i );
    }
    else
    {
        arreglo[i,0] = spr_peces;
        arreglo[i,1] = ds_list_find_value( lista2, i );
    }
}

//---------------------------------------//

m = 4; //número de imágenes a lo ancho
n = 2; //número de imágenes a lo alto
sep = 320; //separación entre orígenes
tot = 8; //total de imágenes a mostrar
j = 0;

for( i=0; i<m; i++ )
{
    if( i+j >= tot ) break; //para no leer partes vacías del arreglo
    for( j=0; j<n; j++ )
    {
        if( i+j >= tot ) break;
        draw_sprite( arreglo[i+j,0], arreglo[i+j,1], i*sep+160, j*sep+480 );
    }
}


[/spoiler]


Tu codigo implementado esta en la versión 0.0.7.5a
Directorio de Descargas:
http://goo.gl/48b3Vb.

Ya me dí cuenta porqué se repite, en en último bucle anidado i+j tiene valores repetidos, entonces hay que usar una variable mas:
[gml]
k = 0;
for( i=0; i<m; i++ )
{
    for( j=0; j<n; j++ )
    {
        draw_sprite( arreglo[k,0], arreglo[k,1], i*sep+160, j*sep+480 );
        k++;
        if( k >= tot ) break;
    }
    if( k >= tot ) break;
}
[/gml]

Holaaaa.

Me dice esto al pulsar el boton de la room y no he sabido solucionarlo ;(

Citar
___________________________________________
############################################################################################
FATAL ERROR in
action number 1
of Draw Event
for object obj_img_random:

Push :: Execution Error - Variable Index [6,1] out of range [6,-1] - -1.arreglo(100008,192001)
at gml_Object_obj_img_random_DrawEvent_1 (line 24) -         draw_sprite( arreglo[k,0], arreglo[k,1], i*sep+160, j*sep+480 );
############################################################################################

Estás intentando leer una parte del arreglo que no está definida. Debe haber una diferencia entre el número de imágenes que le estás agregando y el número de imágenes que quieres dibujar.