Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: metackle en Septiembre 22, 2014, 03:52:38 AM

Título: sistema de bonificacion con ds_lists
Publicado por: metackle en Septiembre 22, 2014, 03:52:38 AM
Hola a todos.
quiero programar un sistema de bonificación estilo super smash bros, por ejemplo, si recolecto 500 monedas, al final del nivel me muestre un mensaje diciendo los bonos que tengo, en este caso "Treasure hunter 1000 points". he leído que lo mejor es que usara ds_lists para hacer esto, pero no entiendo muy como se usan las ds_lists o como utilizarlas en el caso mio.

Si no entienden como es el sistema porque nunca han jugado super smash bros acá hay una imagen:
(http://www.mariowiki.com/images/thumb/4/4a/StageClear-SSBMelee.png/640px-StageClear-SSBMelee.png)

gracias
Título: Re:sistema de bonificacion con ds_lists
Publicado por: kostra en Septiembre 22, 2014, 09:39:43 AM
yo tampoco sé lo que es eso de ds_list xd pero para cosas así, me basta un simple if

por ejemplo:
if stagecoins >= 500 { bonus = true; draw_message(x,y,"Treasure hunter 1000 points!!"); bla bla bla...}
else totalcoins += stagecoins;
Título: Re:sistema de bonificacion con ds_lists
Publicado por: Clamud en Septiembre 24, 2014, 01:03:58 AM
Hola.
El funcionamiento de las listas es muy parecido a el de los arreglos (arrays), pero ,según el manual, funcionan más rápido. También se podría hacer usando variables individuales para cada bonificación, pero usando listas se escribe menos código.
Primero es necesario saber cuántos tipos de bonificaciones se pueden obtener, entonces se crea la lista y se inicializa:
[gml]
bonos = ds_list_create();
for( i=0; i<n; i+=1 ) //n es el número de bonificaciones
    ds_list_add( bonos, 0 ); //todos los elementos de la lista valen cero
[/gml]
Después, cada vez que haces algo que te da puntos extra se agrega a la lista. Cada evento debes identificarlo con un índice:
[gml]
ds_list_replace( bonos, 1, nuevo_valor ); //el 1 corresponde a "First Strike"
[/gml]
Al acabar el nivel se obtiene el total:
[gml]
total = 0;
for( i=0; i<=n; i+=1 )
    total += ds_list_find_value( bonos, i );
[/gml]
Después se dibuja la lista, esto se tendría que hacer elemento por elemento:
[gml]
//First Strike
valor = ds_list_find_value( bonos, 1 );
if( valor > 0 )
    draw_text( x,y,"First Strike" + string(valor) );

//Instant Poser
valor = ds_list_find_value( bonos, 2 );
if( valor > 0 )
    draw_text( x,y,"Instant Poser" + string(valor) );

//...
[/gml]
El código anterior se podría reducir si se usa otra lista que se haya inicializado con los nombres de las bonificaciones, o usando ds_maps, pero en este caso es más sencillo usar listas.
Y antes de comenzar otro nivel la lista se debe reiniciar:
[gml]
for( i=0; i<n; i+=1 ) ds_list_replace( bonos, i, 0 );
[/gml]
Eso es todo, cualquier duda comenta.
Título: Re:sistema de bonificacion con ds_lists
Publicado por: TheSandBoxMKG en Septiembre 24, 2014, 04:31:42 PM
Cita de: Clamud en Septiembre 24, 2014, 01:03:58 AM
Hola.
El funcionamiento de las listas es muy parecido a el de los arreglos (arrays), pero ,según el manual, funcionan más rápido. También se podría hacer usando variables individuales para cada bonificación, pero usando listas se escribe menos código.

Tambien tiene funciones especiales como buscar dn el medio de una lista, agregar en el medio de una lista, etc.
Título: Re:sistema de bonificacion con ds_lists
Publicado por: metackle en Septiembre 24, 2014, 06:25:33 PM
Antes de que me respondieran, hice una prueba con el ds_list_add, me funciona bien, y siento que es menos codigo, solo coloco
ds_list_add(nombre de la lista, "First strike"), pero quiero saber si es mejor asi o como lo dijeron arriba.
otra pregunta, como hacer para saber cuantas veces en la lista esta repetido un elemento o si ya hay un elemento ya en la lista para no volver a agregarlo
Título: Re:sistema de bonificacion con ds_lists
Publicado por: Clamud en Septiembre 24, 2014, 08:07:54 PM
Yo pensé en almacenar los valores numéricos de las bonificaciones, por si eran variables. Pero si tienen un valor único, creo que tu idea es mejor. Sólo se van agregando los nombre en el orden en que ocurren en el juego. Con tu método, sería conveniente que los valores numéricos sean almacenados en un ds_map al inicio del juego.

Para agregar un elemento que no está en la lista se puede hacer lo siguiente:
[gml]
elemento = "First Strike";

if( ds_list_find_index(lista,elemento) == -1 )
    ds_list_add( lista, elemento );
[/gml]

Tal vez ya no necesitas esto, pero para saber cuántas veces se repite un elemento, usa:
[gml]
elemento = "Algo";

contador = 0;
for( i=0; i<ds_list_size(lista); i+=1 )
    contador += (ds_list_find_value(lista,i) == elemento );
[/gml]

Hasta luego.
Título: Re:sistema de bonificacion con ds_lists
Publicado por: metackle en Septiembre 25, 2014, 04:23:00 PM
Gracias, me funciono, es mejor que el método que estaba usando, pero me ha surgido otra duda, por ejemplo, si alguien obtiene demasiados bonus, la lista se prolongara hasta fuera de la pantalla, si ven en la imagen aparece una flecha hacia abajo para indicar que si se presiona la tecla abajo la lista sube y si se presiona arriba la lista baja (tal como en windows), ¿como puedo hacer esto?

De antemano muchas gracias por su ayuda :D