Buenas noches gente!

Tengo un problema al usar el random para que aparezcan enemigos al azar, el código que tengo en el Step del obj_controller que crea los enemigos es este:

if crearenem=true
{
    if ceil(random(200))=true
    {
    instance_create(random(room_width),5,obj_enemy)
    }
    if ceil(random(300))=true
    {
    instance_create(5,random(192),obj_enemy)
    }
    if ceil(random(300))=true
    {
    instance_create((room_width-5),random(192),obj_enemy)
    }


Este código crea enemigos en la parte de arriba y a los lados (por encima de las rocas, ver foto adjunta) y los enemigos van caminando al rectángulo negro de abajo.

El problema es que no lo hace random, siempre salen por el mismo lado cada vez que ejecuto y a los 10 segundos de juego siempre tengo la misma distribución de enemigos en pantalla.

Por qué pasa eso? Puedo usar otro método para que salgan realmente al azar?

Gracias de antemano, saludos!
Solo intento crear ideas, en forma de obras de arte interactivas.

[gml]if ceil(random(200))=true[/gml]
Ese codigo va a ser verdadero a menos que el random produzca un cero.
Lo que debes hacer es guardar el valor del random en una variable temporal y de acuerdo al valor obtenido generar la instancia del enemigo en la posición deseada segun los rangos definidos en cada condicional, como se ve a continuacion.

[gml]if crearenem=true
{
    var valor;
    valor=ceil(random(300))
    if valor >= 200 {
        instance_create(random(room_width),5,obj_enemy)
    }
    if valor < 200 && valor >= 100 {
         instance_create(5,random(192),obj_enemy)
    }
    if valor < 100 {
        instance_create((room_width-5),random(192),obj_enemy)
    }
}
[/gml]
Si crees que aun no funciona revisa la forma en que asignas la posicion de cada objeto, me refiero a los random para los x y y en los instance_create
Cita de: Fenris78Si 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: CalioSomos desarrolladores independientes y, por lo tanto, no tenemos por qué guiarnos por las tendencias del mercado.

#2 Diciembre 06, 2012, 05:22:31 AM Ultima modificación: Diciembre 06, 2012, 05:31:41 AM por Klind
Ya va. No se si estoy entendiendo bien.

Yo uso el if ceil(random(200))=true para decirle la frecuencia en la que salgan los enemigos.

Para explicarme mejor, sabes el D&D del dadito? Que si uno le pone por ejemplo 5 lados, ejecuta la próxima acción 1 de cada 5 veces. Bueno, ese codigo de arriba es eso mismo pero en GML, con un dado de 200 lados.

El problema lo tengo es en eso que dices, la posicion que el instance_create le crea a cada objeto.

O sea en el random(room_width) y el random(192) siempre da una misma secuencia de valores que hace que los enemigos siempre salgan en el mismo orden cada vez que ejecuto.

PERO, aparte de que siempre salen en el mismo orden, siempre salen al mismo tiempo de juego, o sea el random(200) que está en el ceil también da siempre el mismo valor.

No entiendo nada  :(

EDITO: Cómo haces para que tu código salga más grande y con colores? :)
Solo intento crear ideas, en forma de obras de arte interactivas.

Mira yo use ceil(random..... muchas pero muchas veces...
Tu codigo esta bien, solo que los lados son pocos y dejas poco para el random agrégale un 0 mas.
y no uses (random(room_width)) usa mejor esto:
var xx, yy;
xx= irandom_range(0,room_width);
yy= irandom_range(0,room_height);
Vendria quedando asi.

if crearenem=true
{
    if ceil(random(2000))=true
    {
    instance_create(xx,5,obj_enemy)
    }
    if ceil(random(3000))=true
    {
    instance_create(5,yy,obj_enemy)
    }
    if ceil(random(3000))=true
    {
    instance_create(xx,yy,obj_enemy)
    }

#4 Diciembre 06, 2012, 11:45:50 AM Ultima modificación: Diciembre 06, 2012, 11:57:04 AM por Klind
Que tal Elvis!

Mira acabo de intentar con el código que pusiste cambiándole ciertas cosas.

Por ejemplo: yy= irandom_range(0,192);  ya que la distancia entre el borde de arriba y las piedras es de 192.

E intenté poniendole el cero adicional al Ceil pero duraba demasiado para crear los enemigos, salía uno cada 40seg aproximadamente, así que los dejé en 200 y 300.

Y pues, hace lo mismo que el código anterior, solo que cambió la secuencia, pero sigue el problema, cada vez que ejecuto salen en el mismo orden. Será algún bug o defecto del Game Maker?

Yo creo recordar que años atrás, con el Game Maker 7 u 8, me pasaba algo similar con el random, siempre soltaba una misma secuencia.

EDITO: Repito lo siguiente, por si acaso tiene algo que ver:

El código está en el evento STEP de un obj_controller invisible que solo posiciona y crea la instancia del obj_enemy. Cada instancia del obj_enemy se mueve por si sola.

Algo curioso es que cada enemigo cuando es creado, yo le digo que camine hacia cualquier punto X que esté dentro del rectángulo negro (usando random también) y esta secuencia también se repite.

Es decir, aparte de que siempre se crean en la misma posicion, cada uno va siempre en la misma direccion, es como si el random estuviese preestablecido desde el mismo momento que lo escribo en el codigo del objeto.
Solo intento crear ideas, en forma de obras de arte interactivas.

Puede que game maker studio siempre use la misma seed por defecto
Usá randomize() antes del random a ver si te funciona




Cita de: Texic en Diciembre 06, 2012, 04:39:35 PM
Puede que game maker studio siempre use la misma seed por defecto
Usá randomize() antes del random a ver si te funciona

Creo que texic tiene razon, algo leí por ahí de eso, dejo esto a la rápida que ando corto de tiempo :
Cita de: Manual GM S
This function is good for probabilities where returning an integer (whole number) is not necessary. For example, random(100) will return a value from 0 to 99, but that value can be 22.56473! You can also use real numbers and not integers in this function like this - random(0.5), which will return a value between 0 and 0.4999999.

NOTE : This function will return the same value every time the game is run afresh due to the fact that GameMaker:Studio generates the same initial random seed every time to make debugging code a far easier task. To avoid this behaviour use randomize or random_set_seed at the start of your game.

Cita de: Manual GM S Traduccion por Google
Esta función es bueno para probabilidades para devolver un número al azar. Por ejemplo, al random(100) devolverá un valor de 0 a 99, pero este valor puede ser 22,56473! También puede utilizar los números reales y no enteros en esta función como esta - random (0,5), que devolverá un valor entre 0 y -0,4999999.

NOTA: Esta función devuelve el mismo valor cada vez que el juego se ejecuta de nuevo debido al hecho de que GameMaker: Studio genera la misma semilla aleatoria inicial cada vez que el código de depuración para hacer una tarea mucho más fácil. Para evitar este uso conducta aleatoria o random_set_seed al comienzo de la partida.

Orgulloso veterano de CGM
El poder de hacer un buen juego esta en tus manos.

Listo, era cuestión de poner el Randomize al principio del código.

Muchas gracias por el tiempo que se toman en ayudar!

[SOLUCIONADO]
Solo intento crear ideas, en forma de obras de arte interactivas.

Cita de: kakashigna
Cita de: Manual GM SNOTE : This function will return the same value every time the game is run afresh due to the fact that GameMaker:Studio generates the same initial random seed every time to make debugging code a far easier task. To avoid this behaviour use randomize or random_set_seed at the start of your game.
De las cosas que se tiene que enterar uno, XD
Es curioso eso pq me habia pasado algo similar con el modulo random de python y era por la falta de crear el dichoso seed. osea que random_set_seed es esa funcion panacea (por su nombre) que hacia falta conocer.
lo del codigo bonito lo puedes consultar si haces click aqui


Alguno me podria explicar lo de:
[gml]ceil(random(200))=true[/gml]
por favor? como funciona? como es que comprueba el valor?  ???
Cita de: Fenris78Si 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: CalioSomos desarrolladores independientes y, por lo tanto, no tenemos por qué guiarnos por las tendencias del mercado.

ceil = redondea hacia arriba ejemplo si tenes 199.9 da como resultado el redondeo 200.
Random hace que sea aleatorio valor del argument en este caso 200 asi que escoge desde 0 hasta 200 un numero al azar, al encerrarlo y especificar que sea true estas diciendo esto.
cuando el valor redondeado del numero escogido al azar sea 200 ejecuta las acciones.

Me refería especificamente a la comparacion con true.
Entonces solo se crea el enemigo cuando por cosas de la vida el resultado del ceil(random(200)) sea igual a 200, es decir solo cuando el random sea mayor a 199.
Igualmente me deja intrigado, espero tener tiempo para hacer un ensayo.
Cita de: Fenris78Si 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: CalioSomos desarrolladores independientes y, por lo tanto, no tenemos por qué guiarnos por las tendencias del mercado.

True es lo mismo que decir 1, así como false es lo mismo que decir 0




#12 Diciembre 07, 2012, 01:59:36 AM Ultima modificación: Diciembre 07, 2012, 02:03:29 AM por Maitreya
Cita de: TexicTrue es lo mismo que decir 1, así como false es lo mismo que decir 0

creo que lo estas haciendo aun mas confuso XD y tambien creo que no me estan entendiendo  :-[
No me refiero a cosas basicas de GM el que sea, como las funciones ceil y random que creo haber usado bastante y no solo en GM, sino a la forma de usar el resultado de esa expresion booleana, asi como lo hacian por aca
en un rato hago la prueba.
Cita de: Fenris78Si 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: CalioSomos desarrolladores independientes y, por lo tanto, no tenemos por qué guiarnos por las tendencias del mercado.

Es fácil, está diciendo que si el número random que sale es 1, hacer x cosa




Cita de: Texic en Diciembre 07, 2012, 04:51:54 AM
Es fácil, está diciendo que si el número random que sale es 1, hacer x cosa

Exacto, por eso hice la comparación con el D&D del dado, que uno le especifica los lados, y 1 de cada (lados) veces devuelve true.
Solo intento crear ideas, en forma de obras de arte interactivas.