Bonsoir à tous ceux qui vont lire ce message.
Je suis donc actuellement sur la création d'un petit jeu 2D pour me faire la main, et j'ai utilisé un système de tableau à deux dimensions pour pouvoir stocker les données du monde à charger (en gros, les différentes tiles). Pour cela, j'ai donc une classe WorldManager qui, lors de sa création, génère le tableau dynamiquement via une méthode WorldManager::constructeurTableauDynamique (cette dernière renvoyant un int**). J'utilise donc un pointeur sur pointeur sur int, et j'ai initialisé ce pointeur dans mon header de classe (WorldManager.h) de cette manière : int **worldTab.
Ensuite, j'ai deux méthodes, une renvoyant un int, qui correspond à la valeur de la case appelée du tableau (prototype: int getWorldTab(int i , int j). Le return est écrit ainsi: return worldTab[i][j];
L'autre méthode est tout aussi simple, elle permet, à partir de i et de j, de remplir la case du tableau concernée (prototype: void setWorldTab(int i , int j , int set). Voila ce qu'il se passe dans la méthode: worldTab[i][j] = set;
Mon problème est le suivant: lors de la compilation, aucun message d'erreur, mais lorsque j'initialise le tableau (en lançant le programme) dans mon constructeur pour pouvoir le remplir entièrement de 0, je fais appel à this->setWorldTab(i , j , 0); (this puisqu'il s'agit de la même classe), mon debugger m'indique un problème de segmentation lors du passage à la fonction setWorldTab (lorsque i = 0 et j = 0).
Je ne comprends donc pas pourquoi mon pointeur worldTab ne pointe pas où il faut, un peu comme si il était perdu...
J'implore donc gracieusement votre aide amis développeurs, et j'espère que tout n'est pas trop confus... Voila mes WorldManager.cpp et WorldManager.h (ne faites pas attention aux autres classes créées et etc.., elles n'entrent pas en conflit, du moins à ce qu'il paraît):
WorldManager.cpp:
WorldManager.h:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 #include "WorldManager.h" #include "GenerateWorld.h" #include "ImageManager.h" #include "BlockManager.h" #include "Camera.h" #include <SFML/Graphics.hpp> #include <iostream> WorldManager::WorldManager(int const a_tailleX , int const a_tailleY , sf::RenderWindow *a_app , Camera *a_camera , WorldManager *a_worldManager): generator(0), imageManager(0), blockManager(0), tailleX(a_tailleX), tailleY(a_tailleY), worldTab(0) { /* Allocation dynamique du tableau */ worldTab = this->constructeurTableauDynamique(); /* Initialisation */ for (int i = 0 ; i < tailleX ; i++) { for (int j = 0 ; j < tailleY ; j++) { this->setWorldTab(i , j , 0); } } //generator = new GenerateWorld(ptrWorldTab, tailleX, tailleY); //Génère le monde dans un WorldGenerator dynamique imageManager = new ImageManager(); //Création et chargement des images du monde dans un ImageManager dynamique blockManager = new BlockManager(a_worldManager, tailleX, tailleY, imageManager, a_app, a_camera); //Création des blocks pouvant constituer le monde dans un BlockManager dynamique } WorldManager::~WorldManager() { /* Destruction du double tableau */ this->destructeurTableauDynamique(worldTab); delete generator; delete imageManager; delete blockManager; } int** WorldManager::constructeurTableauDynamique() { int** m_worldTab = new int* [tailleX]; for (int i = 0 ; i < tailleX ; i++) { m_worldTab[i] = new int[tailleY]; } return m_worldTab; } void WorldManager::destructeurTableauDynamique(int** m_worldTab) { for (int i=0; i < tailleX; i++) { delete[] m_worldTab[i]; } delete[] m_worldTab; } void WorldManager::blitWorld() { blockManager->blitMap(); } int WorldManager::getWorldTab(int i , int j) { return worldTab[i][j]; } void WorldManager::setWorldTab(int i , int j , int set) { worldTab[i][j] = set; }
PS: j'ai bien un destructeur pour mon tableau à deux dimensions, pas de fuite de mémoire de ce côté là
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 #ifndef WORLDMANAGER_H_INCLUDED #define WORLDMANAGER_H_INCLUDED #include <SFML/Graphics.hpp> #include "GenerateWorld.h" #include "ImageManager.h" #include "BlockManager.h" #include "Camera.h" class WorldManager { public: WorldManager(int const a_tailleX , int const a_tailleY , sf::RenderWindow *a_app , Camera *a_camera , WorldManager *a_worldManager); ~WorldManager(); int** constructeurTableauDynamique(); void destructeurTableauDynamique(int** m_worldTab); void blitWorld(); int getWorldTab(int i , int j); void setWorldTab(int i , int j , int set); private: GenerateWorld *generator; //Création d'un pointeur sur generator ImageManager *imageManager; //Création d'un pointeur sur imageManager BlockManager *blockManager; //Création d'un pointeur sur blockManager //Variables stockant la taille du tableau int const tailleX; int const tailleY; int **worldTab; }; #endif // WORLDMANAGER_H_INCLUDED![]()
Partager