Estoy trabajando en la generación aleatoria de rectángulos para un juego en lienzo, y agregué un código para evitar que los rectángulos generados aleatoriamente se superpongan, sin embargo, en lugar de evitar que mis rectángulos se superpongan, es como si tuviera que superponerse o de lo contrario no lo colocare. aquí está mi código (sé que está desordenado y no optimizado)
function random_place(){ var x,y,height,width x = Math.floor(Math.random() * 10000); y = Math.floor(Math.random() * 100); width = Math.floor(Math.random() * (85 - 20 + 1) + 20); height = Math.floor(Math.random() * (85 - 20 + 1) + 20); return([x,y,width,height]) } function generate_obstacles(obstacles_count){ var counter = 0 var placement var placement_colide = false; console.log(obstacle_array.length) while(counter < obstacles_count){ placement_colide = false; x = Math.floor(Math.random() * 10000); y = Math.floor(Math.random() * 10000); width = Math.floor(Math.random() * 85); height = Math.floor(Math.random() * 60); placement = random_place(); for(let i=0; i<obstacle_array.length; i++){ if(obstacle_array[i][0]+100 > placement[0]+(placement[2]/2)+100 || obstacle_array[i][0]+(obstacle_array[i][2]/2)+40 < placement[0]) { if(obstacle_array[i][1]+35 > placement[1]+(placement[3]/2)+35 || obstacle_array[i][1]+(obstacle_array[i][3]/2)+35 < placement[1]){placement_colide = true; break} } placement_colide = true; break } if((placement[0] > (player_x*2)+5 || placement[0] < (player_x/2)+1.5) && placement_colide == true){ obstacle_array.push(placement); counter++; i = obstacle_array.length } }También tengo el código completo en jsfiddle si eso fuera más fácil de leer https://jsfiddle.net/Fightingox/1dk0oaty/54/
alguien sabe el problema?
No pude averiguar qué hiciste mal porque el código es un desastre.
Los nombres son demasiado largos. Las propiedades se establecen como índices de matriz en lugar de propiedades con nombre. Y más..
En lugar de arreglar su código, lo he reescrito creando algunas funciones y renombrando muchos objetos.
Para crear un rectángulo aleatorio
const randI = range => Math.random() * range | 0; // only for positive ints function randomGameRect() { const x = randI(10000); const y = randI(100); const w = randI(61) + 20; const h = randI(61) + 20; return {x, y, w, h}; }Para comprobar si dos rectángulos se superponen.
function doRectsOverlay(rectA, rectB) { return !( // Overlaps if not any of... rectA.x > rectB.x + rectB.w || // left of rectA right of right of rectB rectB.x > rectA.x + rectA.w || // right of rectA left of left of rectB rectA.y > rectB.y + rectB.h || // top of rectA below bottom of rectB rectB.y > rectA.y + rectA.h); // bottom of rectA above top of rectB } Para agregar un rectángulo rect a una matriz de rectángulos rects si no hay superposición.
Tenga en cuenta que también agregué la verificación del jugador que hace. No estoy seguro de por qué lo haces, así que simplemente lo puse.
function addIfNotOverlap(rect, rects) { if (!rects.some(r => doRectsOverlay(r, rect)) { // check player stuff. I don't know why you do this. if (place.x > (player_x * 2) + 5 || place.x < (player_x / 2) + 1.5) { rects.push(rect); } } } Y la última función reemplaza la tuya. Agrega count rectángulos a la matriz de rectángulos obstacleArray . Esta función requiere todas las funciones anteriores
function generateObstacles(count) { while (count-- > 0) { addIfNotOverlap(randomGameRect(), obstacleArray); } }Espero que esto te ayude a resolver tu problema.