Tableaux...

Résolu
pop70 Messages postés 181 Date d'inscription mardi 6 avril 2010 Statut Membre Dernière intervention 7 janvier 2012 - 12 déc. 2010 à 13:03
pop70 Messages postés 181 Date d'inscription mardi 6 avril 2010 Statut Membre Dernière intervention 7 janvier 2012 - 13 déc. 2010 à 19:13
Bonjour,

Je cherche à faire un petit jeu en 2D,
Celui est constitué d'une Map, sur laquelle viennent se placer toutes sortes d'objets.

Chaque objet a sa classe, et mon problème est d'organiser la Map de façon à ce qu'elle contienne pour chaque coordonnées X , Y un objet.
J'aimerai ensuite pouvoir récupérer les objets en fonction d'une coordonnée.

Du coup j'ai pensé faire hérité chaque objet d'une grosse classe "Objets", et faire la Map sur le modèle d'une classe "Carte".

La classe "Carte" doit être constitué d'un tableau 2D de type "Objets" nommé wMap.

J'ai donc essayé :

std::vector < std::vector <Objets*> > wMap;

Mais cette solution est trop gourmande en CPU et j'ai toujours un RunTime error.

j'ai aussi essayé de le déclarer dans la classe Carte de la façon suivante :

Objets **wMap [][];    

Mais pour celle ci il faut indiquer la mémoire à allouer pour le tableau du genre [100][100], or je ne peux pas, puisque celle-ci doit être définie dans le constructeur...

D'ailleurs si je fais :

Objets *wMap;
dans la classe

et :
 wMap = new wMap[Taille1]; 
dans le constructeur

ça marche,

mais si je fais :

 Objets **wMap;
dans la classe

et :
  wMap = new wMap[Taille1][Taille2];
dans le constructeur

ça ne marche plus...



Merci pour votre aide


Pop70

2 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
13 déc. 2010 à 10:11
Faire tout hériter d'une classe Objet est extrêmement inélégant ! (Je ne parle pas du fait d'hériter d'une classe mère abstraite, mais de la nommer "Objet").

Je te conseille plutôt d'avoir une classe "Cell" (ou "Case" en français) qui peut contenir un ou plusieurs élément. Si tu es sur de n'avoir qu'un et un seul élément, tu peux directement faire un tableau d'éléments.

Ton problème vient du fait que tu ne prends pas en compte le fait que: ** != [][] !
Tu ne peux pas faire un new [][] dans un **. Il te faut faire un new [] suivit d'un new [] dans chacun des éléments de ton tableau.

Si un std::vector de std::vector ne convient pas au niveau performance (ce qui est normal), tu peux te tourner vers du boost::multi_array.

Si tu ne souhaites pas avoir de dépendance sur boost, je te conseille de coder ta propre classe "StaticArray".
Tu lui donne un constructeur "StaticArray(int size)" qui construit un tableau à une dimension de taille fixe. Puis tu peux faire un std::vector<StaticArray*>.

Pour résumer, trois solutions:
1) Boost::multi_array
2) std::vector<StaticArray*>
3) Case **wMap, avec la bonne manière de l'initialiser.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
pop70 Messages postés 181 Date d'inscription mardi 6 avril 2010 Statut Membre Dernière intervention 7 janvier 2012 10
13 déc. 2010 à 19:13
J'ai finalement opté pour un code un peu plus propre...
Ma classe "Carte" ne contient plus qu'un tableau 2D sur des objets "Texture". Et j'ai une troisième classe "Gestion" qui associe les textures aux différents objets ou personnages, et les place sur la Carte.

Merci encore, surtout pour la dissociation entre pointeurs et tableaux que j'ai tendance à mélanger.


Pop70
0
Rejoignez-nous