Hola a todos.¿Como les va ? Los molesto un momento para ver si podemos solucionar este problema que ya me esta por hacer volar los ojos.
Mi duda surge al intentar crear un algoritmo que me permita verificar espacios libres igual al tamaño de un sprite y partiendo de un punto x,y que es determinado al azar.
Por ejemplo:
Si tengo un sprite de 100 x 100 y un valor x = 256 e y= 289 el algoritmo deberia buscar que haya "espacio libre " desde el centro ( x = 256 ; y = 289 ) hacia afuera recorriendo los 100 de alto y los 100 de ancho.
En otras palabras el algoritmo debe hacer "un barrido" del lugar buscando que haya espacios libres al 100% .
En esta imagen de ejemplo se ve: Un punto(que representa el punto al azar ) y el barrido que deberia hacer el Algoritmo( en este caso con un rectangulo ).
(http://www.comunidadgm.org/index.php?action=dlattach;topic=16881.0;attach=11047;image)
Tambien habia pensado algun Algoritmo al estilo Spiral pero no creo que sea demasiado efectivo.
Hola, pues algo sencillo es en anillos, pero obviamente no circulares sino cuadrados, es decir, como lo que tienes es un pixel, el siguiente seria un cuadrado de 3x3 y luego de 5x5, etc. pero cuando la forma sea un rectangulo trabajaras de mas.
Otra opcion es de afuera hacia adentro con anillos en forma del rectangulo indicado, pero el problema es cuando el rectangulo tiene alguna de sus lados de tamaño multiplo de 2, esto es casi siempre.
Saludos.
No entiendo, para qué querés un algoritmo que haga eso con funciones como place_free y collision_rectangle disponibles??
Bueno en todo caso lo que deberías hacer es tomar el punto central y asignar cuatro variables a esa posición (x1,x2,y1,y2)
Con un while vas sumando a x1 y restando a x2 hasta llegar al tamaño del sprite y lo mismo con las y, no sé si necesitás que el barrido sea equitativo o que uno de los ejes termine de recorrerse antes que el otro en el caso de rectángulos. Si necesitás que sea equitativo utilizá porcentajes y lesto
Saludos Makero Moderador Shaoran:
No entiendo bien el objetivo o la pregunta en sí, pero podrías hacerlo con dos ciclos for anidados: uno para las equis (X) y otro para las yees (Y).
El resultado del barrido lo puedes guardar en un arreglo bidimensional (arreglo[x,y]) utilizando números enteros para diferenciar los espacios en blanco de los ocupados, etc.
Sigo sin comprender para qué todo ese trabajo. ¿Acaso deseas comprobar colisiones del tamaño de un píxel? XD ¡Algo pequeñas, no! :-[
Si ofrecieras más información se comprendería mejor que quieres. ;D
La funcion es por que tengo un objeto que crea mas objetos en la pantalla pero bajo ningun concepto se pueden "superponer" uno sobre otro,y hay de todos los tamaños.
Alguna idea para hacerlo con place_free ? o otra funcion?
collision_rectangle te viene al pelo, fijate en el manual, le ponés all si no querés que se superponga con ningún objeto, y si son objetos específicos ponés el nombre del objeto. Si es más de uno chequeas de manera múltiple
Cita de: shaoran en Mayo 17, 2012, 07:12:35 PM
La funcion es por que tengo un objeto que crea mas objetos en la pantalla pero bajo ningun concepto se pueden "superponer" uno sobre otro,y hay de todos los tamaños.
Alguna idea para hacerlo con place_free ? o otra funcion?
Saludos Makero Moderador Shaoran:
Hace relativamente poco tiempo se terminó el "GIA_03 Tetris", en él se tenía en cuenta que las piezas no se superpusieran unas a otras para colocarlas en alguna posición. Las piezas están formadas por cuadros, que bien pudieran ser los píxeles de los "sprites" de tus objetos. :D
Podemos hacer una prueba, he aquí un algoritmo provisional: XD
1* Creas un arreglo bidimensional (array_sprite1[ , ]) para cada "sprite" donde guardas los puntos ocupados (1) y desocupados (0) del mismo.
2* Creas otro arreglo bidimensional (array_room[ , ]) donde guardarás todas las posiciones ocupadas (1) y desocupadas (0) del "room"
Cada vez que vayas a poner algún objeto en el "room" revisas si el arreglo array_sprite1[ , ] cabe en el arreglo array_room[ , ]. En caso de no caber en la posición establecida previamente, cambia la posición vuelve a probar. Solo termina en caso de no encontrar espacio o en caso de encontrar.
Si lo encuentras, debes agregar el nuevo espacio ocupado dentro del arreglo array_room[ , ] para tener en cuenta que ese espacio está ocupado en próximas revisiones.
Este algoritmo es un poco burdo, pero solo es para probar. Se puede optimizar, pero primero trata que funcione, luego lo optimizas. :-[
¿Te hace falta algo más? :D
Eh probado lo de que han puesto, funciona pero hay que limarlo un poco mas.Muchas Gracias a Todos.!