Buenas a todos
Estoy intentando crear objetos aletorios y unicos de entre una lista de 3 posibles objetos. Para verlo más claro: en el juego tenemos 3 habitaciones, en cada una de ellas saldra siempre un objeto de entre estos 3, pero no se podran repetir.
Por ahora he creado un codigo que da un numero aleatorio del 1 al 3, cada numero sera uno de los objetos y si no se ha usado antes, lo crea y cambia la variable para que no se pueda repetir.
randomize()
CofreElegido = irandom_range (1,3)
if CofreElegido = 1 && global.Cofre_Llave = 0
{
instance_create(x,y,Cofre_Llave_OBJ)
global.Cofre_Llave = 1
}
if CofreElegido = 2 && global.Cofre_Arma = 0
{
instance_create(x,y,Cofre_Arma_OBJ);
global.Cofre_Arma = 1
}
if CofreElegido = 3 && global.Cofre_Vida = 0
{
instance_create(x,y,Cofre_Vida_OBJ);
global.Cofre_Vida = 1
}
El problema es que no se como mandar que si sale el numero correspondiente a un objeto ya creado, repita la operacion hasta que salga uno que si sea nuevo... lo queria hacer con una orden estilo goto (para que vaya al principio del codigo hasta que lo consiga) pero no existe en GMS hasta donde he investigado
el goto se ha ido eliminando de los lenguajes de programación por que volvía los programas literalmente un m**rdero difícil de manejar, te recomiendo que estudies las estructuras while, do y for, para que puedas usar ese "reemplazo del goto" que estas buscando
una manera interesante de hacer eso que tu dices seria crear una lista (list) con los valores en orden 1,2,3...
luego desordenarlos (hay una función para eso)
y ir leyendo los valores en orden cada ves que se abra un cofre, por ejemplo, si abres el primer cofre, lees la primera posición (y le sumas un +1 a una variable de conteo)
y cuando vayas a abrir el segundo cofre, se lee la segunda posición, creando el objeto en consecuencia.
aqui te dejo la referencia de las listas:
http://docs.yoyogames.com/source/dadiospice/002_reference/data%20structures/ds%20lists/index.html (http://docs.yoyogames.com/source/dadiospice/002_reference/data%20structures/ds%20lists/index.html)
Desconocia por completo esa funcion.
Es justo lo que necesitaba! muchas gracias! :D
En cuanto la implemente, podre la solucion al problema por si a alguien le pueda interesar
Gracias!
Para quien pueda interesarle, ya lo tengo solucionado:
Primero creo una lista, en mi caso en un evento "create" al principio del juego. Tendra numeros del 1 al 4 y mezclados de forma aleatoria
global.Lista_Cofres = ds_list_create() //Crea lista con ese nombre
ds_list_add(global.Lista_Cofres, 1, 2, 3, 4); //Añade numeros 1 2 3 4
randomize()
ds_list_shuffle(global.Lista_Cofres); //Mezcla los valores
Despues creo un objeto donde ira un evento "Draw", donde se elegira el primer valor de la lista, creara un cofre a consecuencia y eliminara ese valor, siendo el proximo valor totalmente nuevo. Evito asi que se repitan los valores y por tanto los cofres
Cofre = ds_list_find_value(global.Lista_Cofres,0); //Define cofre como el primer elemento de la lista
if Cofre = 1
{action_change_object(Cofre_Arma_OBJ,true);
ds_list_delete(global.Lista_Cofres, 0);
}
if Cofre = 2
{action_change_object(Cofre_Vida_OBJ,true);
ds_list_delete(global.Lista_Cofres, 0);
}
if Cofre = 3
{action_change_object(Cofre_Mental_OBJ,true);
ds_list_delete(global.Lista_Cofres, 0);
}
if Cofre = 4
{action_change_object(Cofre_LlavePeque_OBJ,true);
ds_list_delete(global.Lista_Cofres, 0);
}
Con esto consigo que con un unico objeto, se creen todos los cofres siempre y cuando se repita el objeto tantas veces como elementos tenga la lista, nunca mas! que si no da error claramente.
Si no me he explicado bien o si teneis dudas, comentadlo