Estoy usando Direct3D con el contenedor D3DXSPRITE para dibujar los mosaicos en la pantalla. Tengo una clase de mosaico que contiene miembros como colisión y tipo de mosaico, luego tengo una variedad de mosaicos, por ejemplo
Cuadrícula de azulejos [256] [256];
¿Cuál sería un mejor método?
-Dibuja al jugador en el centro de la pantalla y desvía donde dibuja el mapa.
-Mueva el reproductor con la cámara siguiente.
Estaba usando el primer método, pero se está volviendo realmente complicado cuando llegas al borde superior izquierdo del mapa, y cuando otros jugadores / enemigos están en el mapa y se mueven al mismo tiempo
si hago que la cámara siga al jugador, ¿tendría que llamar a spriteBatch-> Draw (...) para cada mosaico de cuadrícula aunque solo unos pocos puedan caber en la pantalla?
Mover la cámara en coordenadas mundiales y hacer que tu personaje se mueva por el mundo es la forma más fácil de abordar este problema, trabajar en coordenadas mundiales significa que no necesitas hacer ningún cálculo adicional cuando se reduce a todos los otros sistemas que deben funcionar en un sistema de coordenadas relativas y también entender dónde están en las coordenadas mundiales
Dado que está trabajando en 2D, otro buen consejo es hacer una partición espacial, la forma más fácil sería crear un sistema de red virtual mundial, esto le permitirá administrar cada mosaico individualmente mediante la asociación de sprites y otros recursos por mosaico, por lo que en esencia el proceso sería:
cree una clase de mosaico que pueda contener las coordenadas de límite para el mosaico y los recursos que ese mosaico específico pueda necesitar (sprites, enemigos, etc.).
decida el tamaño de su mundo y cree una matriz 2D (puede usar una dimensión y acceder a ella como 2D) de mosaicos, cada uno representando un poco de su mundo con todos sus recursos asociados.
solo extrae recursos del mosaico en el que se encuentra el jugador y sus vecinos.
Con una cuadrícula puede averiguar fácilmente en qué mosaico se encuentra el jugador en función de su posición con respecto al inicio de la cuadrícula.
Para solucionar el problema que mencionó acerca de la cámara, debe hacer que el jugador y la cámara sean dos sistemas independientes donde la cámara no se desplazará más allá del centro de los mosaicos de borde, de modo que cuando el jugador viaja a ese mosaico, todavía puede viajar a través del todo el mosaico ya que está limitado por las coordenadas mundiales (es decir, ya no está centrado en la pantalla) pero la cámara está bloqueada.
fuente
Yo uso una superficie. Creo el mundo entero en una superficie fuera de la pantalla y mantengo una coordenada x e y. Modifico esto a medida que el jugador se mueve y cada cuadro dibuja un rectángulo de 1028 x 768 desde la superficie hasta el búfer de respaldo usando x e y.
En cuanto a otras personas, les doy una x e y les dejo moverse por el mundo como quieran, cuando dibujo verifico si hay x e y en el rectángulo de 1028 x 768 y, de ser así, los dibujo (uso texturas para las personas) .
Tengo el reproductor en el centro de la pantalla y compruebo si el borde del mundo ha llegado al borde de la pantalla. En esta circunstancia, el jugador se mueve por la pantalla hasta el borde del mundo y de regreso al centro, luego el mundo comienza a moverse nuevamente. Parece difícil y me tomó un tiempo, pero no está mal.
Utilizo fichas de 64 x 64 y el mundo más grande que he usado hasta ahora es de 50 x 60 fichas.
Todo esto se hace en x directo con c ++
fuente
Es bastante normal que el código tenga un poco de molestia en las esquinas de un mundo embaldosado, al determinar qué empate dibujar, y al mismo tiempo garantizar que la cámara no se salga del mundo. Esos casos extremos son básicamente lo más complejo de implementar un mundo basado en mosaicos 2D que es más grande que la resolución de pantalla. Se vuelve mucho más complejo si admite el acercamiento y el zoom al cursor: D
fuente