1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| Class World
{
private:
/* std::vector<Area*> areas; // la liste de toutes les zones */
Area* currentArea; // la ozne courante (ou l'on se trouve)
int x,y; // coordonnées de la zone ou l'on se trouve
int id; // identifiant du monde
int nbKeys; // nb de clés pour les donjons
int currentLevel; // étage courant (pour un donjon)
bool bossDead; // si le boss du donjon est mort ou pas
public:
int update() = 0; // gestion du monde
void draw() = 0; // affichage
void gererLeBoss();
void gererLesCles();
.....
} |
Là, tu te retrouves en quelque sorte avec une gold class qui fait tout... Tu exploses le principes de responsabilité unique
/* std::vector<Area*> areas; // la liste de toutes les zones */
Pourquoi conserver une liste des Area ? Elle te sert où et pourquoi faire ? Ça ne serait pas plus simple d'avoir que la map active et un gestionnaire qui a pour responsabilité de charger les maps à la demande et les mettre en cache si nécessaire ?
Area* currentArea; // la ozne courante (ou l'on se trouve)
C'est quoi la différence entre Area et World ? Quels sont leurs responsabilités respectives ? Les noms ne sont probablement pas assez informatif.
int x,y; // coordonnées de la zone ou l'on se trouve
C'est quoi ? C'est pas les coordonnées du personnage plutôt ?
int id; // identifiant du monde
Ok
int nbKeys; // nb de clés pour les donjons
Pourquoi les clés sont un élément de world et pas un item porté par le personnage (comme n'importe quel objet : arme, armure, potions, etc.) ?
int currentLevel; // étage courant (pour un donjon)
Pourquoi un indicateur de level ? Ne pourrais tu pas avoir une map par level simplement ?
bool bossDead; // si le boss du donjon est mort ou pas
Mouais, une variable pour ça... est-ce vraiment utile ? A priori, non si tu utilises des machines à états
1 2 3 4
| int update() = 0; // gestion du monde
void draw() = 0; // affichage
void gererLeBoss();
void gererLesCles(); |
Ouch, le nombre de responsabilité
Mais si j'utilise qu'une seule classe qui possèdent toutes les zones, je ne vais quand même pas charger 500 Zones de tout le jeu en entier dès le démarrage, je vais avoir 1 Go de RAM monté... ^^ lol
Sur une map comme celle de Zelda - A link to the past (qui est quand même un très grosse map), l'image fait 4096*4096 pixels et les tiles font (en gros) 16*16 pixels donc la map est représentée par une tilemap de 256*256. En supposant que les tiles sont codés par un entier "standard" (32 bits, soit plus de 4 milliards de tiles différents possible, ce qui est pas mal non plus) alors la map complète représente... 256 ko en mémoire. Bref rien du tout !
Ce qui est lourd, de n'est pas les tilemaps mais les images représentant les tiles.
Par contre, cela ne veut pas dire qu'il faut quand même charger toutes les maps. Mais il faut relativiser.
Bref, pour en revenir à ta problématique : te prend pas trop la tête. Essaies quand même d'avancer dans le jeu sinon ça te découragera trop.
Au pire, tu recommenceras ton jeu plusieurs fois
Partager