Buenakas! ando haciendo un plagio genérico de maincra, tengo ya 170 items programados, mecánicas sofisticadas, crafteos, construcción etc... muy muy avanzado. Y actualmente empecé a hacer pruebas para la generación de un mapa muy muy grande. El tamaño que he considerado para la room principal de la superficie, la cual trato de generar un terreno pseudo-aleatorio de tierra y más alante poner bordes de arena simulando playas, es de exactamente 12800x12800px, usando una view de 640x352px
Como la interacción con esta tierra base, es mínima y la puedo detectar de muchas maneras, he decidido usar tiles que es mil veces más eficientes que poner una cantidad muy muy masiva de objetos, aun desactivándolos a fuera de la room, entonces, mi generación consiste en un objeto, con un sprite de 2048x2048 las cuales tiene unos cuantos frames con distintas formas que funcionarán como plantillas de pseudo-aleatoriedad. Uso un objeto con este sprite, con el siguiente código:
create:
x = floor( (room_width/2)/16 )*16;
y = floor( (room_height/2)/16 )*16;
image_speed = 0;
image_index = 0;
image_angle = irandom(359);
procesos = 100;
tubo = 0;
for (var i=x-1024;i<x+1024;i+=16) {
for (var j=y-1024;j<y+1024;j+=16) {
if collision_point(i,j,oterraingen,true,false) {
tile_add(tdirt,0,0,16,16,i,j,5);
}
}
}
procesos--;
tubo++;
step:
if procesos {
x = floor( irandom_range(2048,room_width-2048)/16 )*16;
y = floor( irandom_range(2048,room_height-2048)/16 )*16;
image_index = irandom(image_number-1);
image_angle = irandom(359);
for (var i=x-1024;i<x+1024;i+=16) {
for (var j=y-1024;j<y+1024;j+=16) {
if collision_point(i,j,oterraingen,true,false)
&& !tile_layer_find(5,i,j) {
tile_add(tdirt,0,0,16,16,i,j,5);
}
}
}
procesos--;
tubo++;
}
else {
x = room_width/2;
y = room_height/2;
instance_create(x,y,oplayer);
view_object[0] = oplayer;
instance_destroy();
}
y de extra, irrelevante al problema, el tubo de carga en ev draw:
var _tmaxlengh = 500;
var _tmax = 100;
var _tpos = tubo*_tmaxlengh/_tmax;
var _x = view_xview[0]+view_wview[0]/2-_tmaxlengh/2;
var _y = view_yview[0]+view_hview[0]/2;
draw_set_colour(c_black);
draw_rectangle(0,0,room_width,room_height,false);
draw_set_colour(c_white);
draw_rectangle(_x,_y-2,_x+_tmaxlengh,_y+2,true);
draw_rectangle(_x,_y-2,_x+_tpos,_y+2,false);
Una vez hayan entendido el método que hice, veo que solo con 100 procesos (y no niego que me encantarían más), se me genera un terreno (una especie de gran isla) que me acaba de gustar sin que quede tierra suelta inaccesible y/o formas muy raras que no me convencen... Observo que usar tiles, probablemente sí ayuda, incluso si están activos todos a la vez ( hablamos de +300k tiles ), pero claro, como podrán adivinar... se me tira ~20 mins generando terreno y esto me parece un problema MUY GORDO que hará que el jugador se canse de esperar y cierre el juego...
Alguna sugerencia para mejorar este método. O incluso alguna idea para tener una generación parecida aun que deba de cambiar radicalmente el método?