Estoy haciendo un juego similar a Legend of Zelda: Link to the Past (acción-aventura 2D de arriba hacia abajo). Quiero que el personaje permanezca centrado en la pantalla cuando se mueve.
Actualmente, cada vez que el jugador quiere moverse, muevo todo el mapa en la dirección opuesta. Esto funciona, pero a medida que agrego más objetos al mundo, moverlos todos se vuelve más complicado.
¿Hay una mejor manera de abordar esto?
Respuestas:
La forma típica de manejar esto es crear un objeto de cámara. La forma más simple de una cámara es solo una posición. Esta cámara simple define el "centro" de la vista actual. Por lo tanto, no modifica todas las posiciones de sus mosaicos / entidades, solo resta las coordenadas de la cámara de las posiciones al dibujar. En esta situación, la cámara no se "mueve".
Si bien la cámara y su personaje compartirán una posición la mayor parte del tiempo, es posible que aún desee tenerlos como valores separados, por lo que puede, por ejemplo, evitar que la cámara se mueva cuando llegue al fin del mundo, pero permita que jugador para continuar moviéndose.
Una cámara un poco más avanzada se mueve. Todas las entidades y mosaicos se dibujan sin desplazamiento y la posición desde la que está procesando los cambios. Esto es muy similar a la cámara más básica, y aún puede realizar muchas de las mismas optimizaciones para renderizado selectivo (solo invocando
draw
lo que la cámara puede ver), en ambos. Es esencialmente una forma diferente de pensarlo.fuente
cam variables
... y ofreció un método alternativo ... stackoverflow.com/questions/18199373/…No, esta es la forma incorrecta de hacerlo.
¿Cómo vas a hacer la detección de trampas? ¿Qué pasa cuando el jugador llega a los bordes de las paredes? ¿Su sistema de visualización funcionará para mazmorras o tendrá que volver a escribir una parte significativa del código?
El mundo es geometría. El jugador es geometría. El mundo no se mueve. El jugador lo hace. Establezca la posición de la cámara para centrarse en el reproductor. Siempre . Y eso es todo lo que hay que hacer.
No tratar de conseguir la suposición con "oh si me deslice el mundo, entonces se dará la apariencia de que el jugador se está moviendo". Simplemente complicará las matemáticas con sistemas de coordenadas extraños al final del día.
Es cierto que el renderizado de OpenGL en realidad funciona "arreglando la cámara para apuntar hacia abajo - z, y transformando y girando toda la geometría del mundo para que se ajuste al volumen de la vista canónica", pero no debes pensar de esa manera al programar .
gluLookAt
tiene parámetros nombradoseye
,look
yup
por una razón, por lo que puede pensar en términos de un sistema de coordenadas sensible.fuente