J'utilise Direct3D avec le wrapper D3DXSPRITE pour dessiner les tuiles à l'écran. J'ai une classe de tuiles qui contient des membres tels que la collision et le type de tuile, puis j'ai un tableau de tuiles par exemple
Grille de tuiles [256] [256];
Quelle serait la meilleure méthode?
-Dessinez le joueur au centre de l'écran et décalez où la carte dessine.
-Déplacez le lecteur avec la caméra suivante.
J'utilisais la première méthode, mais cela devient vraiment compliqué lorsque vous arrivez en haut à gauche de la carte, et lorsque d'autres joueurs / ennemis sont sur la carte et se déplacent en même temps
si je fais suivre la caméra au joueur, devrais-je appeler spriteBatch-> Draw (...) pour chaque tuile de la grille même si seulement quelques-unes peuvent tenir sur l'écran?
Déplacer la caméra en coordonnées mondiales et faire déplacer votre personnage dans le monde est la façon la plus simple d'aborder ce problème, travailler en coordonnées mondiales signifie que vous n'avez pas besoin de faire de calculs supplémentaires quand cela se résume à tous les autres systèmes qui doivent fonctionner sur un système de coordonnées relatives et également comprendre où ils se trouvent dans les coordonnées du monde.
Puisque vous travaillez en 2D, une autre bonne astuce consiste à faire un partitionnement spatial de la manière la plus simple serait de créer un système de grille de monde virtuel, cela vous permettra de gérer chaque tuile individuellement en associant des sprites et d'autres ressources par tuile, donc en substance, le processus serait:
créer une classe de tuile qui peut contenir les coordonnées de limite pour la tuile et toutes les ressources dont une tuile spécifique peut avoir besoin (sprites, ennemis, etc.).
décidez de la taille de votre monde et créez un tableau 2D (vous pouvez utiliser une dimension et y accéder en 2D) de tuiles représentant chacune un peu de votre monde avec toutes ses ressources associées.
tirez uniquement des ressources de la tuile dans laquelle se trouve le joueur et de ses voisins.
Avec une grille, vous pouvez facilement découvrir dans quelle tuile le joueur se trouve en fonction de sa position par rapport au début de la grille.
Pour contourner le problème que vous avez mentionné à propos de la caméra, vous devez faire du lecteur et de la caméra deux systèmes indépendants où la caméra ne se déplacera pas plus loin que le centre des tuiles de bord. tuile entière car il est lié par les coordonnées du monde (c'est-à-dire qu'il n'est plus centré sur l'écran) mais la caméra est verrouillée.
la source
J'utilise une surface. Je crée le monde entier sur une surface hors écran et garde une coordonnée x et y. Je les modifie au fur et à mesure que le joueur se déplace et chaque image dessine un rectangle de 1028 x 768 de la surface au backbuffer en utilisant x et y.
quant aux autres personnes je leur donne un x et y et je les laisse se déplacer dans le monde à leur guise, en dessinant je vérifie s'il y a x et y dans le rectangle 1028 x 768 et si oui dessine-les (j'utilise des textures pour les gens) .
J'ai le joueur au centre de l'écran et vérifie si le bord du monde a atteint le bord de l'écran. Dans ce cas, le joueur se déplace sur l'écran jusqu'au bord du monde et revient au centre, puis le monde recommence à bouger. ça me parait difficile et m'a pris du temps mais ce n'est pas trop mal à faire.
J'utilise des tuiles 64 x 64 et le plus grand monde que j'ai utilisé jusqu'à présent est de 50 x 60 tuiles.
Tout cela se fait en direct x avec c ++
la source
Il est tout à fait normal que le code soit un peu pénible dans les coins d'un monde carrelé, lorsque vous déterminez les éléments à dessiner et assurez-vous simultanément que la caméra ne sort pas du monde. Ces cas de bord sont fondamentalement la chose la plus contraignante à implémenter un monde basé sur des tuiles 2D qui est plus grand que la résolution de l'écran. Cela devient beaucoup plus complexe si vous prenez en charge le zoom avant et le zoom sur le curseur: D
la source