Implémentation d'une caméra / vue dans un jeu 2D


21

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:

Illustration de la fenêtre / du monde du jeu

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


1
Ajoutez votre troisième lien dans les commentaires ici et je peux l'ajouter à votre question.
MichaelHouse

Voici ce que je voulais dire avec la zone morte de la caméra: youtube.com/watch?v=89TRXUm8jMI
bluekirai


Bonjour @Arthur Wulf White, voulez-vous élaborer? Merci.
bluekirai

La caméra que vous mentionnez est une version spécifique d'une caméra 2D générale qui est uniquement utilisée pour compenser la vue (pas de rotation ni de zoom). Le comportement de suivi peut être implémenté en vérifiant la distance entre le personnage du joueur et la caméra, en déplaçant la caméra si la distance est trop grande.
wolfdawn

Réponses:


20

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:

int screenX, screenY; //screen position of the object being drawn

screenX = object.x-camera.x;
screenY = object.y-camera.y;

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.


2

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 glOrthoet glTranslate.

Voir ce fil .


Quelqu'un peut-il expliquer le downvote? C'est logique.
Hello World

1
Je n'ai pas voté contre, mais je pense que c'est parce que cela ne répond même pas à la question. La question est de savoir comment calculer quelque chose, pas s'il est plus efficace ou plus facile à faire sur un GPU vs un CPU. L'OP a même dit qu'il cherchait des pseudo exemples. Il ne fait aucun doute que l'utilisation d'une combinaison de matrices caméra / monde / modèle serait plus efficace, donc mklingen a au moins un point.
Dan Watkins

Cette réponse n'est pas mauvaise du tout! C'est plus spécifique au développement OpenGL / DX, mais c'est la bonne approche car vous pouvez simplement calculer une matrice de traduction basée sur les coeurs de caméra et déplacer des objets via la matrice de came, sans changer leurs positions réelles.
nenchev
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.