En un juego basado en fichas 2d, ¿cuál es un buen método para desplazarse?

9

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?


fuente

Respuestas:

4

Probablemente sea mejor hacer todas las actualizaciones y cálculos en unidades "reales" del mundo y mover la cámara. Su spriteBatch puede realizar el sacrificio por sí mismo, pero si es demasiado lento, puede intentar determinar qué mosaicos deben mostrarse en la pantalla y solo dibujarlos.


fuente
Probablemente querrá escribir código para dibujar solo los sprites visibles, especialmente si descubre que necesita aumentar el tamaño de su cuadrícula.
2

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.

Sergio Franco
fuente
0

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 ++

Skeith
fuente
1
Esto parece un enorme cerdo de memoria. Mantener el mundo entero dibujado en una superficie fuera de la pantalla te llevará a problemas de memoria una vez que comiences a querer hacer cosas como tener múltiples capas (animadas) para tu mundo y expandirlo más de lo que tienes ahora. Sería mucho mejor mantener la información sobre el mundo y solo dibujar las partes / objetos que necesitan dibujarse cuando necesitan dibujarse. Solo mis 2 centavos. :)
Richard Marskell - Drackir
@Drackir Creo que lo malinterpretas. solo el mundo se dibuja fuera de la pantalla, cosas como las otras personas se rastrean y dibujan en el búfer de respaldo cuando se necesitan. Tampoco me veo haciendo más de 70 x 70 mundo. cuando digo mundo me refiero a área, esto podría ser una ciudad, un calabozo o el interior de una casa, cuando el jugador se mueve entre ellos, se reconstruye la superficie fuera de la pantalla. sí, requiere memoria, pero las baldosas 2d en las unidades modernas de terrabite lo hacen insignificante y unos pocos segundos de carga es un pequeño precio a pagar por un desplazamiento y animación suaves. pero sí, hay formas mejores y más difíciles :)
Skeith
La superficie debe almacenarse en la memoria de la tarjeta GFX, no en el disco duro. Sin embargo, creo que si la memoria de la tarjeta GFX es demasiado grande, moverá las superficies al HD, lo que ralentizaría considerablemente las cosas. Es cierto que ha pasado un tiempo desde que me ocupé de esas cosas, así que no recuerdo exactamente cómo funcionó, pero supongo que mientras no estés dibujando un mundo demasiado grande, estaría bien. :)
Richard Marskell - Drackir
@Drackir Es interesante saberlo, nunca lo pensé así. Descubrí que de esta manera me da un desplazamiento más suave que si dibujaba dinámicamente nuevos mosaicos, así que creo que encaja bien, pero tendré que investigar eso.
Skeith
Estaba trabajando en un juego donde tenía mapas 31x31 pero estaban unidos uno al lado del otro. Intentaba trabajar desde el motor de otra persona y dibujaban todos los mapas que rodeaban al que tenía el jugador; entonces nueve mapas en total. Cada mapa tenía varias (creo que 6) capas. Entonces, como 31x31x9x6 = 51894 fichas dibujadas (máximo, por supuesto; no todas las fichas estaban llenas) cada vez que el usuario cambia de mapa. Esa fue una gran ralentización para mí, por lo que reescribí la rutina de dibujo para dibujar solo las fichas que rodean al jugador hasta 1 ficha más allá del borde de la pantalla (para manejar fichas parciales mientras se mueve).
Richard Marskell - Drackir
0

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

Cliffski
fuente