Noticias

¡Ayuda a la Comunidad GM, haz una donación!

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: [SOLUCIONADO] Problema con las funciones random de gml  (Leído 122 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado visionjav

Buenas, tras un día trasteando con el código noté que las funciones random(n), irandom(n), random_range(n, m) e irandom_range(n, m) no me están funcionando como esperaría que un random funcionase en cualquier lenguaje de programación.

Dejo el código de ejemplo que estoy haciendo y algunas capturas a ver si alguno sabe porque pasa esto y puede explicarmelo.

Dado -> Evento Crear:
Código: [Seleccionar]
dice_value = irandom(6);
image_index = dice_value;

dice_speed = 10;
last_moving = false;

Dado -> Evento Paso:
Código: [Seleccionar]
image_speed = dice_speed;
if (dice_speed == 0 && last_moving)
{
dice_value = irandom(6);
image_index = dice_value;
last_moving = !last_moving;
}

Adjunto 2 capturas en las que se ve el resultado de 2 tiradas consecutivas. Se pude ver como el valor de los dados siempre es x x+1 x+2 x+1, haga las tiradas que haga en esa ejecución de programa siempre va a ser esa relación de valores.

En la sala tengo, como se puede ver, 4 instancias del dado añadidos manualmente arrastrándolos desde la barra derecha, y un botón con el siguiente código:

Boton -> Crear:
Código: [Seleccionar]
is_rolling = true;

Boton -> Izquierdo Soltado:
Código: [Seleccionar]
is_rolling=!is_rolling;
if (is_rolling)
{
ob_dice.dice_speed=10;
}
else
{
ob_dice.dice_speed=0;
}


He intentado variar entre los 4 métodos de random pero siempre consigo lo mismo y creo que hay alguna parte importante que me estoy saltando y no alcanzo a ver.

Gracias de antemano :D
« última modificación: Abril 13, 2019, 01:20:45 pm por visionjav »

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado NiuWeb

  • Flota de Justicia Particular.
  • Moderadores globales
  • Okupa
  • *
  • Puntos: 2820
  • Mensajes: 1.701
  • Agradecido: 136 veces
  • Sexo: Masculino
  • Rock anthem for saving the world.
    • Ver Perfil
Respuesta #1 en: Abril 13, 2019, 02:38:25 am
Te hace falta utilizar la función maravilla del GM xd.

http://docs2.yoyogames.com/source/_build/3_scripting/4_gml_reference/maths/real%20valued%20functions/randomise.html

Solo tienes que usarla una vez, al inicio del juego (antes de cualquier función de aleatoriedad, claramente).

El tiempo era tu aliado, humano, pero te ha abandonado.
Los Forerunners han regresado, esta tumba ahora es tuya.

-Ur-Didacta.


BA:STFW&RTFM
 
Los siguientes usuarios dieron las gracias a este tema: visionjav


Desconectado visionjav

Respuesta #2 en: Abril 13, 2019, 12:51:23 pm
Te hace falta utilizar la función maravilla del GM xd.

http://docs2.yoyogames.com/source/_build/3_scripting/4_gml_reference/maths/real%20valued%20functions/randomise.html

Solo tienes que usarla una vez, al inicio del juego (antes de cualquier función de aleatoriedad, claramente).

Muchas gracias por tu respuesta.

Algo mas debo estar haciendo mal porque he probado a poner tanto randomize() como randomise() en el codigo de la sala(room) en el codigo de los evento create, tanto del boton como del dado e incluso crear un objeto unicamente para esa pieza de codigo.

El randomize() lo unico que me hace es que al darle click al boton el primer valor que sale sea aleatorio, tras eso, el valor del segundo dado siempre es +1 del primero, el del tercer dado +2 del primero y el del cuarto dado +1 del primero.

Se que tengo que estar haciendo algo mal en algún sitio pero estoy perdidisimo.


ACTUALIZADO

Boton -> Izquierdo Soltado:
Código: [Seleccionar]
is_rolling=!is_rolling;
if (is_rolling)
{
ob_dice.dice_speed=10;
ob_dice.last_moving = true; //<--------------------------------
}
else
{
ob_dice.dice_speed=0;
}

Había olvidado poner la linea:
Código: [Seleccionar]
ob_dice.last_moving = true;
Por lo que nunca se activaba la flag last_moving y nunca se le modificaba el valor a los dados, por lo que siempre seguían la misma estructura con los que se inicializaban al principio.

Gracias a todos por vuestro tiempo y ayuda :D
« última modificación: Abril 13, 2019, 01:38:36 pm por visionjav »

 


Desconectado Johann

  • Las cosas como son!
  • Moderadores globales
  • Okupa
  • *
  • Puntos: 720
  • Mensajes: 827
  • Agradecido: 108 veces
  • Sexo: Masculino
  • First Class Soldier... 10 años en CGM, 5 como mod
    • Ver Perfil
Respuesta #3 en: Abril 13, 2019, 06:28:55 pm
Lo que hace randomize() es inicializar una nueva secuencia de números aleatorios, estableciendo lo que llaman la "semilla", por eso Niu te dice que se usa UNA UNICA VEZ al empezar el juego (puede ser en un evento game_start o room_start) para que luego si puedas obtener números aleatorios con las funciones random normales (random, irandom, random_range, etc).

Cita de: Fenris78
Si un tema os resulta de interes y veis que hay poca información, la mejor solucion no es quejarse o pedir sin pensar, sino sugerir algo bien planteado o aportarlo vosotros mismos.
Cita de: Calio
Somos desarrolladores independientes y, por lo tanto, no tenemos por qué guiarnos por las tendencias del mercado.
 
Los siguientes usuarios dieron las gracias a este tema: visionjav


Desconectado visionjav

Respuesta #4 en: Abril 13, 2019, 07:29:39 pm
Lo que hace randomize() es inicializar una nueva secuencia de números aleatorios, estableciendo lo que llaman la "semilla", por eso Niu te dice que se usa UNA UNICA VEZ al empezar el juego (puede ser en un evento game_start o room_start) para que luego si puedas obtener números aleatorios con las funciones random normales (random, irandom, random_range, etc).

Buenas, efectivamente he estado usando randomize() una unica vez en el room_start y esto estaba consiguiendo que la primera tirada de dados fuese aleatoria, mi problema por el que abri la consulta es que a partir de esa primera tirada, no volvia a ser random siempre era el mismo esquema, y es que al tener mal lo que comente de no volver a llamar las funciones random porque la flag me olvide de ponerla a true cada vez que tiraba los dados, simplemente estaba rotando los dados la misma cantidad de veces todas las tiradas, sin aleatorizar nada.

Muchas gracias de todas formas, gracias a los enlaces que me habeis ido proporcionando he podido ir viendo mejor como funciona todo esto :D llevo apenas unos dias con Game Maker y poco a poco le voy pillando el gusto :D