Primero lo primero:
Cada objeto de tu mundo ocupa diferente cantidad de cuadros de 16x16, esa es el área de colisiones a chequear al mover.
Cada objeto debe tener determinada el área que ocupan en el mundo. Yo particularmente lo determinaría con un "array". Dicho "array" tendría la forma de determinar todos los cuadros que ocupa dicho objeto a partir de un cuadro pivote (o de referencia) de la siguiente manera:
Representaré las columnas como "b" y las filas como "a". Tomo como pivote el cuadro rojo con la "palomita" y a partir de él redacto matemáticamente donde están los demás cuadros rojos. Un cuadro está del cuadro de pivote a un cuadro más por las columnas en la misma fila, lo que es igual a: a+0, b+1. Otro cuadro está situado debajo del cuadro de pivote lo que equivale a un cuadro más por las filas en la misma columna: a+1, b+0. El último cuadro está situado del cuadro pivote a un cuadro más por las filas y un cuadro más por las columnas: a+1, b+1.
En dicho, que estará presente en cada objeto, solo guardo las posiciones relativas al cuadro pivote del objeto en cuestión. ¿Por qué relativas a un punto? Por que solo podemos posicionar a un objeto con un punto, pero si a partir de es punto conocemos el área que ocupa, que son sus cuadros, podemos controlar si colisiona o no en su totalidad con solo un punto.
Cada vez que el objeto se vaya a mover solo moverá el cuadro de pivote a las coordenadas de GM y a partir de él preguntará si el resto de los cuadros están vacíos o no.
Para saber que espacios del mundo están vacíos o llenos tendremos que llevar un "array" a modo de matriz con los cuadros del mundo ya ocupados. Para tener todos los datos actualizados en la matriz crearemos un algoritmo que recorra el mundo una sola vez, al inicio del juego para que sitúe los objetos inicialmente y otro algoritmo que escribirá y borrará los objetos móviles cada vez que se muevan.
Las bases del algoritmo son las ya mencionadas. Ahora presentaremos los pasos que debe hacer el juego para el control de colisiones y así sabremos nosotros que debemos programar:
1 el juego se inicia por lo que el objeto controlador crea la matriz del mundo, un "array" bidimensional (array[a,b]). Recorre todo el mundo ("room") y localiza cada objeto situado en él y lo registra en la matriz cuadro por cuadro. Ya está listo para empezar.
2 Cada objeto antes de moverse debe:
2.1 verificar si está vacío el cuadro de la matriz que coincide con la posición nueva a moverse, en caso de que esté vacío debe comprobar que el resto de los cuadros que componen al objeto pueden posicionarse también. En caso de que todo de positivo debe indicarle al objeto controlador que va a moverse y este borrará la posición vieja y escribirá la nueva en la matriz. Luego el objeto ejecuta la animación de moverse. En caso de que cambie de fila en la matriz debe actualizarse la profundidad para dibujar al objeto.
Implementar todos esos pasos es sencillamente meticulosidad, nada complicado solo trabajoso. Una vez esté implementado se verán las ventajas a la hora de implementar un algoritmo de IA que busque caminos posibles, que persiga, que esquive los obstáculos, incluso que realice emboscadas con cierto grado de inteligencia.
Esto es solo lo que debe hacer el código, para programarlo solo hay que ir paso a paso para evitar errores o variables inservibles.
Sería bueno saber como tratas los niveles, si es un "room" completo o solo una parte de un "room" gigantesco. Para determinar el tamaño de la matriz a utilizar en cada momento pues podemos tener, por ejemplo: una matriz mundo grande y otra pequeña que será solo del tamaño de la "view" porque en el juego ustedes decidieron que lo que estaba fuera de la "view" no se movería ya que no es multijugador.
Necesito saber las características del juego para poder diseñar los algoritmos óptimos pues se ajustan a las particularidades de cada proyecto. A demás no tengo mucho tiempo, mi idea es que aprendan en el proceso y lo programen ustedes, así sabrán mejor arreglarlo a la hora de los errores.
Si no entiendes dímelo que estoy en línea.
Cada objeto de tu mundo ocupa diferente cantidad de cuadros de 16x16, esa es el área de colisiones a chequear al mover.
Cada objeto debe tener determinada el área que ocupan en el mundo. Yo particularmente lo determinaría con un "array". Dicho "array" tendría la forma de determinar todos los cuadros que ocupa dicho objeto a partir de un cuadro pivote (o de referencia) de la siguiente manera:
Representaré las columnas como "b" y las filas como "a". Tomo como pivote el cuadro rojo con la "palomita" y a partir de él redacto matemáticamente donde están los demás cuadros rojos. Un cuadro está del cuadro de pivote a un cuadro más por las columnas en la misma fila, lo que es igual a: a+0, b+1. Otro cuadro está situado debajo del cuadro de pivote lo que equivale a un cuadro más por las filas en la misma columna: a+1, b+0. El último cuadro está situado del cuadro pivote a un cuadro más por las filas y un cuadro más por las columnas: a+1, b+1.
En dicho, que estará presente en cada objeto, solo guardo las posiciones relativas al cuadro pivote del objeto en cuestión. ¿Por qué relativas a un punto? Por que solo podemos posicionar a un objeto con un punto, pero si a partir de es punto conocemos el área que ocupa, que son sus cuadros, podemos controlar si colisiona o no en su totalidad con solo un punto.
Cada vez que el objeto se vaya a mover solo moverá el cuadro de pivote a las coordenadas de GM y a partir de él preguntará si el resto de los cuadros están vacíos o no.
Para saber que espacios del mundo están vacíos o llenos tendremos que llevar un "array" a modo de matriz con los cuadros del mundo ya ocupados. Para tener todos los datos actualizados en la matriz crearemos un algoritmo que recorra el mundo una sola vez, al inicio del juego para que sitúe los objetos inicialmente y otro algoritmo que escribirá y borrará los objetos móviles cada vez que se muevan.
Las bases del algoritmo son las ya mencionadas. Ahora presentaremos los pasos que debe hacer el juego para el control de colisiones y así sabremos nosotros que debemos programar:
1 el juego se inicia por lo que el objeto controlador crea la matriz del mundo, un "array" bidimensional (array[a,b]). Recorre todo el mundo ("room") y localiza cada objeto situado en él y lo registra en la matriz cuadro por cuadro. Ya está listo para empezar.
2 Cada objeto antes de moverse debe:
2.1 verificar si está vacío el cuadro de la matriz que coincide con la posición nueva a moverse, en caso de que esté vacío debe comprobar que el resto de los cuadros que componen al objeto pueden posicionarse también. En caso de que todo de positivo debe indicarle al objeto controlador que va a moverse y este borrará la posición vieja y escribirá la nueva en la matriz. Luego el objeto ejecuta la animación de moverse. En caso de que cambie de fila en la matriz debe actualizarse la profundidad para dibujar al objeto.
Implementar todos esos pasos es sencillamente meticulosidad, nada complicado solo trabajoso. Una vez esté implementado se verán las ventajas a la hora de implementar un algoritmo de IA que busque caminos posibles, que persiga, que esquive los obstáculos, incluso que realice emboscadas con cierto grado de inteligencia.
Esto es solo lo que debe hacer el código, para programarlo solo hay que ir paso a paso para evitar errores o variables inservibles.
Sería bueno saber como tratas los niveles, si es un "room" completo o solo una parte de un "room" gigantesco. Para determinar el tamaño de la matriz a utilizar en cada momento pues podemos tener, por ejemplo: una matriz mundo grande y otra pequeña que será solo del tamaño de la "view" porque en el juego ustedes decidieron que lo que estaba fuera de la "view" no se movería ya que no es multijugador.
Necesito saber las características del juego para poder diseñar los algoritmos óptimos pues se ajustan a las particularidades de cada proyecto. A demás no tengo mucho tiempo, mi idea es que aprendan en el proceso y lo programen ustedes, así sabrán mejor arreglarlo a la hora de los errores.
Si no entiendes dímelo que estoy en línea.