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.


#1 Febrero 05, 2015, 06:50:19 PM Ultima modificación: Febrero 05, 2015, 06:52:47 PM por penumbra
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]

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]

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.

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.

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/

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

Saludos,
La verdad es como la luz de una vela, que ni la oscuridad inmensa, puede opacarla.