¿Cuál es la forma más práctica de implementar la cámara / vista en un juego 2D?
He leído que debo almacenar la posición del mundo del objeto en lugar de la posición relativa a la pantalla.
Situación actual:
He implementado un juego 2D simple donde cargo objetos y niveles desde archivos XML. Actualmente, el archivo XML de nivel tiene este aspecto:
<map>
<tile obj="ground" x="0" y="555" />
<tile obj="ground" x="16" y="555" />
<tile obj="ground" x="32" y="555" />
...
</map>
Todos los objetos tienen una "posición" de 2d-vector que almacena su ubicación actual en la pantalla.
Lo que quiero que sea:
En la imagen:
- La cámara es de 800x600 o 640x480
- Los bloques y sprites son de 16x16 píxeles.
- El tamaño mundial puede variar
- ¿Las coordenadas probablemente deberían normalizarse en relación con el mundo, no con la pantalla?
- Posición de la vista relativa a la x, y del jugador y se mueve cuando el jugador alcanza la zona muerta de la cámara (similar a este video ).
Estoy preguntando pseudo ejemplos / artículos, pero si necesita saber lo que estoy usando para el desarrollo: SDL & C / C ++.
c++
2d
architecture
camera
bluekirai
fuente
fuente
Respuestas:
Debe tener cada objeto posicionado en relación con el mundo en lugar de la pantalla. Su cámara también debe tener sus propias coordenadas mundiales para poder dibujarla en una posición relativa en el mundo. También puede ser conveniente que su cámara siga un objeto, de modo que donde sea que esté, la cámara solo usa sus coordenadas. Por lo general, las coordenadas de la cámara la posicionarán desde la esquina superior izquierda. Esto significa que la cámara tendría una posición mundial de aproximadamente (0,24) en la imagen .
En cuanto a dibujar realmente los objetos que la cámara puede "ver", debe dibujar todos los objetos en relación con las coordenadas mundiales de la cámara. Para calcular la posición de la pantalla de un objeto en relación con la cámara, simplemente haga:
Obviamente, algunos objetos no son realmente visibles para la cámara, por lo que es posible que desee implementar un sistema de selección de vistas.
fuente
Es mejor hacer todo esto en la GPU utilizando las matrices World y View, no modificando dónde dibuja los objetos en la CPU.
De esa manera, puede cambiar la cámara arbitrariamente (¡incluso acercarla y alejarla!) Y funcionará mágicamente. También puede ver el sacrificio visual para ahorrar tiempo de sorteo. Y ninguno de sus códigos para dibujar el mundo tendrá que cambiar después de haber configurado la vista y las matrices del mundo correctamente.
En SDL, probablemente pueda simplemente hacer llamadas OpenGL en línea como
glOrtho
yglTranslate
.Ver este hilo .
fuente