Bonjour à tous ceux qui me liront,
Je me suis mis, il y a quelque temps à la programmation d'un petit jeu en 2D utilisant SDL sous linux. Rien de bien sorcier, c'est surtout à des fin d'auto-formation. Afin de continuer dans cette optique je me suis dis que pour stocker ma carte j'allais utiliser les maps de la stl. C'est bien là que les choses se corsent. J'ai du mal à visualiser dans quelle direction partir. Je vais tout de suite passer dans le vif du sujet. Si vous voulez voir le reste du code vous pouvez le consulter ici : https://github.com/Shaihuld/Provas
Voici le code source définissant ma carte :
les classes pour ma map :
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 #ifndef MAP_H #define MAP_H #include <iostream> #include <map> #include "latlon.h" #include "latloncomp.h" #include "block.h" using namespace std; typedef map<LatLon,Block,LatLonComp> world; class Map{ private : public: world myworld; world::iterator itr; Map(); }; #endif -------- // je peuple ma carte de cette façon : #include "map.h" Map::Map(){ int i,j; for (i = 0; i<3;i++){ for (j=0; j<10; j++){ cout << "i :" << i << " j : " << j << endl; myworld[LatLon(i,j)] = Block(2); } } for (i = 3; i<10;i++){ for (j=10; j<15; j++){ cout << "i :" << i << " j : " << j << endl; myworld[LatLon(i,j)] = Block(1); } } }
-latlon :
-mon objet de comparaison :
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 #ifndef LATLON_H #define LATLON_H class LatLon { private : int x, y; public: LatLon(int, int); //geters int Get_x() const; int Get_y() const; //seters void Set_x(int); void Set_y(int); }; #endif --------- #include "latlon.h" LatLon::LatLon(int i, int j){ x = i; y = j; } int LatLon::Get_x() const{ return x; } int LatLon::Get_y() const{ return y; } void LatLon::Set_x(int xp){ x = xp; } void LatLon::Set_y(int yp){ y = yp; }
-et mon block (j'ai plusieurs constructeurs pour savoir si ça ne venait pas du fait que ce soit un appel à un ctor de copy ou quelque chose comme ça qui provoquait mon problème):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #ifndef LATLONCOMP_H #define LATLONCOMP_H class LatLonComp { public: bool operator() (LatLon a, LatLon b) { if (a.Get_x() == b.Get_x()) return a.Get_y()< b.Get_y() ; if (a.Get_y() == b.Get_y()) return a.Get_x()< b.Get_x() ; } }; #endif
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 #ifndef BLOCK_H #define BLOCK_H class Block { private : public: int t; Block(); Block(int); Block(const Block& p); Block & operator= (const Block & b); }; #endif -------- #include "block.h" #include <iostream> using namespace std; Block::Block(){ t=0; } Block::Block(int a){ t=a; } Block::Block(const Block& b) { t = 4; cout << "copy ctor" << endl; } Block & Block::operator= (const Block & b) { Block::t=b.t; cout << "operator = " << endl; return *this; }
voilà ma fonction qui va gérer l'affichage :
cependant rien n'a l'air de bien vouloir apparaitre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 void Display::blit_map(Map& w, int tw, int th){ SDL_Rect p; for(w.itr = w.myworld.begin() ; w.itr != w.myworld.end() ; ++w.itr){ p.x =(*w.itr).first.Get_x()*tw; p.y = (*w.itr).first.Get_x()*th; if ((*w.itr).second.t == 2){ blit_image("watter.bmp", p, 0); } else { blit_image("error.bmp", p, 0); } } }
Alors j'espère que je ne suis pas totalement hors sujet en postant celà ici.
J'aimerai comprendre ce que je ne fais pas correctement dans ma map qui fait que l'affichage ne fonctionne pas.
Aussi je me demande si la méthode que j'utilise est correcte pour ce que je veux faire.
Pour finir, comment repartir de la position centrale de mon futur personnage vers la liste des blocks à afficher (j'ai encore un peu de temps pour ça).
Si vous désirez plus d'informations n'hésitez pas. Si vous voulez que je clarifie quelque chose aussi dites moi ! Je suis un peu dans mon truc donc ça me semble clair et il se peut que je ne traduise pas exactement ce que je veux dire.
Merci de m'avoir lu et de votre aide.
Partager