Quelle est la façon la plus pratique d'implémenter une caméra / fenêtre d'affichage dans un jeu 2D?
J'ai lu que je devrais stocker la position du monde de l'objet au lieu de la position par rapport à l'écran?
Situation actuelle:
J'ai implémenté un simple jeu 2D où je charge des objets et des niveaux à partir de fichiers XML. Actuellement, le fichier XML de niveau ressemble à ceci:
<map>
<tile obj="ground" x="0" y="555" />
<tile obj="ground" x="16" y="555" />
<tile obj="ground" x="32" y="555" />
...
</map>
Tous les objets ont une "position" 2d-vector stockant leur position actuelle sur l'écran.
Ce que je veux que ce soit:
Sur la photo:
- La caméra est de 800x600 ou 640x480
- Les blocs et les images-objets sont de 16 x 16 pixels.
- La taille du monde peut varier
- Les coordonnées devraient probablement être normalisées par rapport au monde, pas à l'écran?
- Position de la fenêtre par rapport aux x, y du joueur et se déplace lorsque le joueur atteint la zone morte de la caméra (similaire à cette vidéo ).
Je demande des pseudo exemples / articles, mais si vous avez besoin de savoir ce que j'utilise pour le développement: SDL & C / C ++.
c++
2d
architecture
camera
bluekirai
la source
la source
Réponses:
Vous devez avoir chaque objet positionné par rapport au monde au lieu de l'écran. Votre caméra doit également avoir ses propres coordonnées mondiales afin de pouvoir être dessinée à une position relative dans le monde. Il peut également être pratique que votre caméra suive un objet. Ainsi, où que se trouve l'objet, la caméra utilise simplement ses coordonnées. En règle générale, les coordonnées de la caméra la positionneront dans le coin supérieur gauche. Cela signifie que la caméra aurait une position mondiale d'environ (0,24) sur l' image .
Quant au dessin des objets que la caméra peut "voir", vous devez dessiner tous les objets par rapport aux coordonnées universelles de la caméra. Pour calculer la position de l'écran d'un objet par rapport à la caméra, faites simplement:
De toute évidence, certains objets ne sont pas réellement visibles par la caméra, vous pouvez donc implémenter un système de tri de vue.
la source
Il est préférable de faire tout cela dans le GPU en utilisant les matrices World et View, pas en modifiant l'endroit où vous dessinez les objets sur le CPU.
De cette façon, vous pouvez changer la caméra arbitrairement (même zoomer avant et arrière!) Et cela fonctionnera comme par magie. Vous pouvez également visualiser les abattages pour gagner du temps sur le dessin. Et aucun de votre code pour dessiner le monde ne devra changer après avoir correctement configuré la vue et les matrices de monde.
Dans SDL, vous pouvez probablement simplement incorporer des appels OpenGL tels que
glOrtho
etglTranslate
.Voir ce fil .
la source