Muy buenas Comunidad GM :), espero que esteis muy bien.
Ayer comencé con un proyecto llamado mazora, el cual trata de conseguir tesoros en mazmorras aleatorias. Ya llegue a desarrollar los scripts que hacen que se generen aleatoriamente. Pero luego pensé en agregar una puerta en la habitación final donde estará tambien la escalera para pasar al siguiente nivel. Y entonces llega mi pregunta. ¿Como hago que se genere un objeto (en este caso la puerta), en una habitación aleatoria solo una vez? les dejaré el proyecto por si necesitais ver a fondo el codigo (es muy largo). Espero que me podais ayudar :-[
Por favor ayudadme, lo necesito
Ok, empezar por decir que esta no es la unica manera de hacerlo, y no es necesariamente la manera más eficiente de hacerlo, es simplemente la manera en que se me ocurrio para hacerlo sin hacer muchos cambios al código ya existente.
Primero, declara una variable en el objeto obj_bloque, la llamaremos Remplazable y la iniciaremos en 0.
Segundo, en el script de creacion de salas agregamos código que cambie el valor de Remplazable a 1 en los obj_bloques que forma parte de una sala
[gml]var Inst = instance_create(xcenter*32 + i*32, ycenter*32 + j*32, obj_bloque);
Inst.Remplazable = 1;[/gml]
Tercero, creamos un nuevo script, llamado colocar_puerta, que correra justo despues de generar_laberinto, el script buscara al azar obj_bloques que tengan la variable Remplazable en 1, es decir que sean parte de una sala, y que tengan dos bloques a los costados linealmente, es decir que no sean una esquina. Cuando encuentre un bloque que cumpla ambas condiciones lo remplazara con un objeto obj_puerta.
[gml]do {
var n = irandom(instance_number(obj_bloque));
var Obj_id = instance_find(obj_bloque,n);
with (Obj_id) {
if Remplazable == 1 {
var De,iz,Ar,Ab;
De = position_meeting(x+32,y,obj_bloque);
Iz = position_meeting(x-32,y,obj_bloque);
Ar = position_meeting(x,y-32,obj_bloque);
Ab = position_meeting(x,y+32,obj_bloque);
if (De == 1 && Iz == 1 && Ar == 0 && Ab == 0) ||
(De == 0 && Iz == 0 && Ar == 1 && Ab == 1){
instance_create(x,y,obj_puerta);
instance_destroy();
}
else {
Remplazable = 0;
}
}
}
}until instance_exists(obj_puerta);[/gml]
Saludos Void, gracias por tu respuesta, pero cuando fui a probar el ejemplo, vi que las puertas se remplazan por paredes que llevan fuera de la mazmorra. Existe alguna manera de que se genere en medio de los pasillos? Aqui te dejo la foto para que veas donde está la puerta y donde me gustaría ponerla.
Ah, ahora entiendo lo que quieres, en ese caso lo mas simple es hacer que el script crear_sala cree una puerta en la entrada de cada sala, y despues de que generar_laberinto haya corrido eliminar todas las puertas menos la última creada, de manera que solo la última sala tenga puerta.
Muchisimas gracias Void. Me has solucionado el mayor problema que se me presentó en ese juego.
Te reitero las gracias y nos vemos en el proximo post 8) 8)