Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: ascoiderº en Febrero 06, 2015, 09:08:54 PM

Título: Ayuda con código, generación de objetos aleatorios
Publicado por: ascoiderº en Febrero 06, 2015, 09:08:54 PM
Muy buenas noches,

estoy desarrollando un juego en el que se generan objetos de forma aleatoria en una posicion fija y tengo problemas. Quisiera saber si alguien puede localizar donde esta el fallo porque yo soy incapaz.

Funcionamiento:
obj_master genera un objeto aleatorio según este código

randomize()
azar=irandom(100)

if score>=0 if score<=4
{if azar>=0 if azar<=80
{instance_create(x+0,y+0,choose(obj_A,obj_B,obj_C))}
if azar>=81 if azar<=100
{instance_create(x+0,y+0,obj_D)}}

if score>=5 if score<=9
{if azar>=0 if azar<=72
{instance_create(x+0,y+0,choose(obj_A,obj_B,obj_C))}
if azar>=73 if azar<=100
{instance_create(x+0,y+0,obj_D)}}

if score>=10 if score<=24
{if azar>=0 if azar<=55
{instance_create(x+0,y+0,choose(obj_A,obj_B,obj_C))}
if azar>=56 if azar<=70
{instance_create(x+0,y+0,choose(obj_A2,obj_B2,obj_C2))}
if azar>=71 if azar<=100
{instance_create(x+0,y+0,obj_D)}}

if score>=25
{if azar>=0 if azar<=45
{instance_create(x+0,y+0,choose(obj_A,obj_B,obj_C))}
if azar>=46 if azar<=65
{instance_create(x+0,y+0,choose(obj_A2,obj_B2,obj_C2))}
if azar>=66 if azar<=70
{instance_create(x+0,y+0,obj_X)}
if azar>=71 if azar<=100
{instance_create(x+0,y+0,obj_D)}}


NOTA: azar=irandom y azar>=0 modificados

una vez aparece un objeto al azar, se destruye el obj_master

al interactuar con el objeto aleatorio, éste da un punto y genera de nuevo el obj_master (inmediatamente despues se destruye el objeto aleatorio tb) y se repite la secuencia de nuevo.


El problema es que de repente se dejan de generar mas objetos. GMStudio no da error y he probado a buscar una pauta y es totalmente al azar (puede ser despues de haber aparecido cualquiera de los objetos y tb puede pasar a los 4 puntos, a los 20, a los 77...).
Tb he revisado cada objeto por separado y todos tienen exactamente las mismas acciones.


Si alguien tiene especial interés y quisiera ayudarme puedo pasar un enlace del proyecto por privado.
Tb hice el mismo proyecto en GM8 y con esa versión nunca se me quedó colgado pero como quiero exportar en un futuro a android... he tenido q comerme el marrón de repetirlo prácticamente todo.
Título: Re:Ayuda con código, generación de objetos aleatorios
Publicado por: arcangelcaos en Febrero 07, 2015, 12:21:17 AM
Hola, estoy en el movil, pero para mi entender veo alguna cosa rara.
chouse (random (100)) Eso porque lo pones asi?? Si random ya elige uno al azar?? El chouse para que??.
Y lo de  if xx=2 if yyy=1???? Porque pones 2 if seguidos,?? No seria  if  xxx=2 and yyy=1, creo k seria asi.
Título: Re:Ayuda con código, generación de objetos aleatorios
Publicado por: Clamud en Febrero 07, 2015, 04:17:47 AM
Si, parece que el error está en la segunda línea, como dice arcangelcaos, deberías cambiarla por esto [gml]azar = irandom(100);[/gml]y efectivamente, un doble if equivale a un and, según un artículo que estaba leyendo http://help.yoyogames.com/entries/27617403 (http://help.yoyogames.com/entries/27617403), es recomendable usar if's anidados porque GMS no tiene un sistema de "corto circuito" (aunque, no estoy seguro, creo que eso ya lo arreglaron), pero al usar ese método el código es más difícil de leer, y también es difícil de leer por el modo en el que están escritas las llaves, deberías reorganizar el código.
Título: Re:Ayuda con código, generación de objetos aleatorios
Publicado por: penumbra en Febrero 07, 2015, 05:31:48 AM
Concuerdo, el formato que usas hace difícil leer el código. La evaluación de corto circuito está integrada en Studio desde las primeras versiones 1.3, incluso en las preferencias es posible desactivarla, pero por defecto viene activa.
Título: Re:Ayuda con código, generación de objetos aleatorios
Publicado por: ascoiderº en Febrero 07, 2015, 11:49:20 AM
La verdad soy nuevo en esto y apenas conozco mucho de código, sobre todo en la version de Studio (ya digo q en GM8 nunca me dió fallo). Creí haber encontrado el fallo en mi código (azar>0, en vez de azar>=0 porque el numero 0 es tambien un numero incluido en los 100 y si no cubro ese resultado pues no sale nada) pero después de camibar esto sigue pasando que deja de invocar más objetos U_U

Ya he cambiado la segunda linea a irandom pero lo de optimizar los if no lo entiendo, si pudierais poner un ejemplo, por favor.
Luego, no se si derivado de esto pero al exportar a Android solo se invoca el primer objeto, una vez destruido ya no aparece ni uno mas.

Muchisimas gracias.

PD: randomize() es necesario en la primera linea?
Título: Re:Ayuda con código, generación de objetos aleatorios
Publicado por: ascoiderº en Febrero 09, 2015, 07:41:20 PM
Buenas, siento ser pesado pero sigo sin solucionar este problema. En este momento el código es asi:


azar=irandom(100)

if score<=0 and score>=20
      {
      if azar>=0 and azar<=80
            {
            instance_create(x+0,y+0,choose(obj_A,obj_B,obj_C))
            }
      if azar>=81 and azar<=100
            {
            instance_create(x+0,y+0,obj_D)
      }

if score... etc


Sigue fallando de la misma manera. Me habéis comentado de reorganizar el código pero mi conocimiento es limitado y no entiendo otra manera. Si pudiera alguien dejar un ejemplo me iría de perlas, por favor.
Título: Re:Ayuda con código, generación de objetos aleatorios
Publicado por: penumbra en Febrero 09, 2015, 08:39:21 PM
Cita de: ascoiderº en Febrero 07, 2015, 11:49:20 AM
PD: randomize() es necesario en la primera linea?
Sí, randomize siempre e necesario antes de llamar a la primera función aleatoria (choose, random, irandom, etc)

Cita de: ascoiderº en Febrero 09, 2015, 07:41:20 PM
Si pudiera alguien dejar un ejemplo me iría de perlas, por favor.

No alcanzo a comprender por qué usas ese procedimiento que comentas en el primer mensaje: generar un objeto aleatorio y borrar el objeto master, y después que el objeto aleatorio " da un punto"  (un punto de qué o para qué) se vuelve a crear el objeto master. A mi esta manera de borrar un objeto y luego generarlo de nuevo no me convence. Podría hacer un ejemplo, pero creo que necesitamos saber cuál es la idea de que el objeto aleatorio "dé un punto" y luego cree al objeto máster y se destruya.) y también por qué usas distintos objetos A, B, C, D y E. Así sin tener idea de lo que quieres, me parece que se podrían usar menos objetos en todo el proceso.
Título: Re:Ayuda con código, generación de objetos aleatorios
Publicado por: ascoiderº en Febrero 09, 2015, 08:58:45 PM
Ok, explico mas claramente mi proyecto.

En un punto fijo hay un generador de objetos. El jugador obtiene puntos interactuando (disparando) con los objetos buenos (A, B, C) y muere con el malo (D) o si deja pasar cualquiera de los objetos buenos. Cuantos más puntos se consiguen las probabilidades cambian y se va complicando con más objetos diferentes. Cada objeto aparece durante 20 steps así el jugador tiene ese tiempo para reconocerlo y dispararlo o no (no hay bala que viaje hacia el objeto por tanto la interacción es instantánea). Hay una pausa entre cada aparición de 20 steps.

Cuando hice el proyecto en GM8 el obj_master no se destruía y contenía tanto las pausas como el código invocador pero tuve que hacer un obj_master por cada rango de puntos y otro objeto invisible tenía un evento step para comprobar y cambiar el master una vez se alcanzaba una puntuación concreta.
El problema era, aparte de tener que hacer un obj_master por cada rango de puntuacion (de 0-10, 11-25, 26,50, etc.), que si por ejemplo se dispara a un objeto A cuando lleva 10 steps en la pantalla después quedaban 10+20 steps de pausa y pensando cómo corregir esto (que siempre sean 20 sin importar en qué momento se haya disparado) al final llegué al sistema de crear y destruir el obj_master. Lo ideal sería "reiniciar" el obj_master (con su alarma de 20 steps de pausa) cada vez que se dispara a un objeto pero yo no se si eso se puede hacer.
Título: Re:Ayuda con código, generación de objetos aleatorios
Publicado por: penumbra en Febrero 10, 2015, 02:16:00 AM
Aquí te dejo un ejemplo. El ejemplo está hecho de manera que cada 20 steps se genera un objeto al azar, y si el usuario no destruyó el objeto anterior, el juego lo destruye antes de crear el nuevo(No había visto que mencionaste que si el usuario deja pasar un objeto bueno, el juego se termina). No sé que función tiene el objeto X, yo le puse la misma función que el objeto D, es decir, los objetos D y X son malos, si les disparas, se termina el juego.

Todo el código de los if y el azar lo meti a un script, que se ejecuta en la alarma[0] del objeto master.
http://www.mediafire.com/download/tvi42d2421roc7o/Generacion_random.gmz (http://www.mediafire.com/download/tvi42d2421roc7o/Generacion_random.gmz)

Para que el juego se termine si el usuario deja pasar un objeto bueno, hay que cambiar el código de la alarma de esto
[gml]
if  instance_exists(target)
{
    with (target)
        instance_destroy()
}[/gml]

a esto:[gml]
if  instance_exists(target)
{
    generar = 0
     muere = 1
}[/gml]
Título: Re:Ayuda con código, generación de objetos aleatorios
Publicado por: ascoiderº en Febrero 10, 2015, 01:41:50 PM
Buenas, he probado tu ejemplo y creo que si consigo ajustar una última cosa me vendrá perfecto.

El inconveniente es que los objetos salen unos detrás de otro así:
obj(20st), obj(20st), obj(20st), obj(20st), ........ etc.
Y quiero que haya una pausa (un momento sin ningún objeto en pantalla), y la secuencia sería:
obj(20st), nada(20st), ob(20st), nada(20st), ........ etc. Siendo "nada" el momento durante el cual no debe aparecer ningún objeto.

No quiero que salgan los objetos seguidos. Y como dije, q el momento "nada" sea siempre de 20 steps, osea que si disparo cuando el objeto lleva 10 steps desde su aparición y éste desaparece, luego q no queden los 10 steps restantes más los 20 siguientes de la pausa entre objetos.
Quizás creando un objeto invisible y no sólido que siempre se alterne con los objetos aleatorios, o bien que adjuntar una alarma previa a la aparición del objeto aleatorio de 20 steps... pero no tengo ni idea de cómo integrar estas ideas.  ???

Mi juego está inspirado en la mecánica de éste https://www.youtube.com/watch?v=CdX_Wj_9jAk Quizás así se entienda mejor.
Aprecio mucho tu tiempo y el de los otros usuarios. Muchas gracias.
Título: Re:Ayuda con código, generación de objetos aleatorios
Publicado por: penumbra en Febrero 10, 2015, 08:39:13 PM
No es necesario recurrir a más objetos. Sólo modificando el comportamiento de los objetos que ya existen, se puede hacer lo que buscas.

Se puede declarar una variable "espera" en el objeto master.

CREATE
[gml]espera = 0[/gml]

Cada objeto generado tendría su propia alarma de 20 steps, si tras cumplirse ese limite, el usuario no hizo click, pues se termina el juego, pero si el usuario sí hizo click, se hace
EVENTO MOUSE LEFT PRESSED de los objetos generados
[gml]if (obj_master.espera == false)
{
      obj_master.alarm[11] = 20              //Activar la alarma de espera del objeto master
      obj_master.generar = 0                   //No ejecutar el script de generación
}[/gml]

en ALARM[11] del objeto master:
[gml]
generar = 1
alarm[0] = 1
espera = 0
[/gml]

Cosas más, cosas menos, en esencia, en esto consistiría la modificación. El código para terminar el juego habría que sacarlo de la alarma[0] del objeto master pues esa alarma ya  sólo se encarga de generar objetos, y los propios objetos son los que revisan si se termina el juego o no.