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:
dice_value = irandom(6);
image_index = dice_value;
dice_speed = 10;
last_moving = false;
Dado -> Evento Paso:
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:
is_rolling = true;
Boton -> Izquierdo Soltado:
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
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).
Cita de: NiuWeb 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).
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:
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:
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
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: Johann 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).
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