Bonjour,
Dans la suite de ce sujet où je proposais une conversion en C++/SDL2 du premier tutoriel sur tilemapping de Fvirtman, je vous soumets ici une version C++/SDL du deuxième tutoriel de la série.
Je précise que je fais ces conversions dans le but d'apprendre à utiliser C++ et SDL2 et je suis donc à la recherche de tout avis ou critique sur le code que j'ai produit.
Pour le moment je n'ai pas utilisé les classes C++, c'est la prochaine étape.
J'ai ajouté en pièces jointes les fichiers nécessaires à la compilation et les ressources nécessaires à l'exécution.
Le zip contient les mêmes fichiers ainsi que la texture, que je n'ai pas pu ajouter directement. Je ne sais pas pourquoi.
Merci pour vos retours,
Eldergrim
fmap.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 #include <SDL2/SDL.h> #include <vector> #include <string> #include <iostream> using namespace std; typedef struct { SDL_Rect R; int mur; } TileProp; typedef struct { int LARGEUR_TILE, HAUTEUR_TILE; int nbtilesX, nbtilesY; SDL_Texture* tileset; vector<TileProp> props; vector<vector<int>> schema; int nbtiles_largeur_monde, nbtiles_hauteur_monde; } Map; Map* chargerMap(string level, SDL_Renderer *ren); int afficherMap(Map* m, SDL_Renderer *pRenderer);
fmap.cpp
prog2.cpp
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120 #include <string> #include <SDL2/SDL.h> #include <SDL2/SDL_Image.h> #include <stdexcept> #include <iostream> #include <fstream> #include "fmap.h" using namespace std; SDL_Texture* loadTexture(const string &filename, SDL_Renderer *ren) { SDL_Texture *texture = IMG_LoadTexture(ren, filename.c_str()); if (texture == nullptr) { throw runtime_error("Failed to load image : " + filename + IMG_GetError()); } return texture; } void chargerMapTileset(ifstream &file, Map* m, SDL_Renderer *ren) { string ligne; file >> ligne; // #tileset file >> ligne; // nom du fichier m->tileset = loadTexture(ligne, ren); file >> m->nbtilesX >> m->nbtilesY; int widthTileset; int heightTileset; SDL_QueryTexture(m->tileset, NULL, NULL, &widthTileset, &heightTileset); m->LARGEUR_TILE = widthTileset/m->nbtilesX; m->HAUTEUR_TILE = heightTileset/m->nbtilesY; string nameTile; string typeTile; // Initialisation des coordonnées des tiles dans la texture du tileset (sources) for(int j = 0, numtile = 0; j < m->nbtilesY; j++) { for(int i = 0; i < m->nbtilesX; i++, numtile++) { m->props.push_back(TileProp()); m->props[numtile].R.w = m->LARGEUR_TILE; m->props[numtile].R.h = m->HAUTEUR_TILE; m->props[numtile].R.x = i*m->LARGEUR_TILE; m->props[numtile].R.y = j*m->HAUTEUR_TILE; file >> nameTile >> typeTile; m->props[numtile].mur = 0; if (typeTile == "mur") m->props[numtile].mur = 1; } } } void chargerMapLevel(ifstream &file, Map* m) { string levelTxt; file >> levelTxt; // #level file >> m->nbtiles_largeur_monde >> m->nbtiles_hauteur_monde; vector<int> v(m->nbtiles_largeur_monde, 0); for(int y = 0; y < m->nbtiles_hauteur_monde; y++) { m->schema.push_back(v); for(int x = 0; x < m->nbtiles_largeur_monde; x++) { int tmp; file >> tmp; if (tmp >= m->nbtilesX * m->nbtilesY) { cout << "level tile hors limite" << endl; SDL_Quit(); system("pause"); exit(-1); } m->schema[y][x] = tmp; } } } Map* chargerMap(string level, SDL_Renderer *ren) { ifstream file(level.c_str(), ios::in); Map* m; if (! file) { cout << "fichier " << level << " introuvable !!" << endl; SDL_Quit(); system("pause"); exit(-1); } m = new Map(); chargerMapTileset(file, m, ren); chargerMapLevel(file, m); file.close(); return m; } int afficherMap(Map* m, SDL_Renderer *pRenderer) { SDL_Rect Rect_dest; Rect_dest.w = m->LARGEUR_TILE; Rect_dest.h = m->HAUTEUR_TILE; int numero_tile; for(int y = 0; y < m->nbtiles_hauteur_monde; y++) { for(int x = 0; x < m->nbtiles_largeur_monde; x++) { Rect_dest.x = x*m->LARGEUR_TILE; Rect_dest.y = y*m->HAUTEUR_TILE; numero_tile = m->schema[y][x]; SDL_RenderCopy(pRenderer, m->tileset, &(m->props[numero_tile].R), &Rect_dest); } } return 0; }
level.txt
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 #include "fmap.h" void logSDLError(ostream &os, const string &msg) { os << msg << " error : " << SDL_GetError() << endl; } int main(int argc,char** argv) { SDL_Window *screen; SDL_Renderer *pRenderer; SDL_Event event; Map* m; bool quit = false; if (SDL_Init(SDL_INIT_EVERYTHING) != 0) { logSDLError(cout, "SDL_Init"); return 1; } // prepare SDL screen = SDL_CreateWindow( "Tile Mapping - 002", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 360, 208, SDL_WINDOW_SHOWN); if (screen == nullptr){ logSDLError(cout, "CreateWindow"); return 2; } pRenderer = SDL_CreateRenderer(screen, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (pRenderer == nullptr){ logSDLError(cout, "CreateRenderer"); return 3; } m = chargerMap("level.txt", pRenderer); afficherMap(m, pRenderer); SDL_RenderPresent(pRenderer); while (!quit){ while (SDL_PollEvent(&event)){ if (event.type == SDL_KEYDOWN) quit = true; } } SDL_DestroyTexture(m->tileset); SDL_DestroyRenderer(pRenderer); SDL_DestroyWindow(screen); SDL_Quit(); return 0; }
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 #tileset tileset1.bmp 8 1 tile0: ciel tile1: mur tile2: mur tile3: mur tile4: mur tile5: mur tile6: mur tile7: mur #level 15 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 0 0 0 2 2 2 2 0 0 2 2 0 0 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 5 6 0 0 0 0 0 0 0 0 0 0 0 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
Partager