Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Rubenvecino en Febrero 05, 2015, 12:46:48 PM

Título: Aclaración con ds_list
Publicado por: Rubenvecino en Febrero 05, 2015, 12:46:48 PM
Buenas tardes compañeros,

Llevo unos días mirando como funciona ds_list para un juego. El problema es que dejé un poco de lado el GM desde que hice mi primer juego y ahora voy perdidísimo.
He buscado en el foro pero las cosas que ponen no se si me lian más de lo que estoy, o que además me he vuelto más torpe.

Pongo el ejemplo que he visto del usuario y jefe Wadk: http://www.comunidadgm.org/preguntas-y-respuestas/191c243mo-saco-30-objetos-de-90-posibles-sin-repetir-ninguno/msg70553/#msg70553

Lo he intentado usar, pero no me funciona.
En un objeto he puesto este codigo en el evento create:
list = ds_list_create();
ds_list_add(list, 0, obj_sol);
ds_list_add(list, 1, obj_luna);
ds_list_add(list, 2, obj_estrella);
ds_list_add(list, 3, obj_cometa);


Después en el objeto boton en el evento left pressed:
var idball, ball;
idball = floor(random(ds_list_size(list)));
ball = ds_list_find_value(list, idball);
ds_list_delete(list, idball);


instance_create(100, 100, ball);


Pero siempre me sale este fallo:
Push :: Execution Error - Variable Get -1.list(100003, -2147483648)
at gml_Object_obj_bola_LeftButtonPressed_1 (line 3) - idball = floor(random(ds_list_size(list)));


Lo único que quiero, es tener una lista de objetos y que cuando use varios botones para que salga un objeto, no repita el objeto.

Si alguien me ilumina en este problema se lo agradecería muchísimo.

Título: Re:Aclaración con ds_list
Publicado por: penumbra en Febrero 05, 2015, 06:50:19 PM
El ejemplo de Wadk se refiere a colas de prioridad list = ds_priority_create();

Que no es lo mismo que list = ds_list_create();

Esto:
ds_list_add(list, 0, obj_sol)

Debería ser
[gml]ds_list_add(list, obj_sol);[/gml]
Título: Re:Aclaración con ds_list
Publicado por: Clamud en Febrero 05, 2015, 06:58:51 PM
Eso es extraño, ¿porqué al compilar no marcó el error en el número de argumentos?

He usado un método más sencillo para obtener objetos sin repetición, el primer código quedaría así:
[gml]
///Create
list = ds_list_create();
ds_list_add( list, obj_sol );
ds_list_add( list, obj_luna );
ds_list_add( list, obj_estrella );
ds_list_add( list, obj_cometa );
ds_list_shuffle( list );
[/gml]
y el otro así:
[gml]
if( ds_list_size(list) > 0 )
{
    instance_create(100, 100, ds_list_find_value(list,0) );
    ds_list_delete( list, 0 );
}
[/gml]
Título: Re:Aclaración con ds_list
Publicado por: penumbra en Febrero 05, 2015, 07:12:05 PM
Creo que no da error porque la función permite agregar múltiples elementos (hasta 15) a la lista en una sola llamada, cosa que no he intentado.
Título: Re:Aclaración con ds_list
Publicado por: Rubenvecino en Febrero 05, 2015, 07:38:15 PM
Gracias Penumbra y Clamud, ahora lo probaré.

Es que en principio son más de 15 objetos, en total unos 100.
Por eso aunque la probabilidad de que se repita uno no tendría que ser muy alta, ya me salieron unos cuentos repetidos.

En cuanto lo pruebe os digo.

Muchas gracias de nuevo.
Título: Re:Aclaración con ds_list
Publicado por: kaliman777 en Febrero 05, 2015, 10:45:18 PM
Entra en este post y revisa, acá hay más detalles de lo que buscas.
http://www.comunidadgm.org/desarrollo-de-scripts/lista-de-enteros-sin-repeticion/ (http://www.comunidadgm.org/desarrollo-de-scripts/lista-de-enteros-sin-repeticion/)

Suerte, si no, me avisas y te paso un ejemplo.

Saludos,