5 pièce(s) jointe(s)
Conversion C++/SDL2 du deuxième tutoriel sur le tilemapping
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:
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
Code:
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;
} |
prog2.cpp
Code:
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;
} |
level.txt
Code:
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 |