IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Conversion C++/SDL2 du deuxième tutoriel sur le tilemapping


Sujet :

SDL

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 32
    Points : 47
    Points
    47
    Par défaut 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 : 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
    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;
    }
    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
    #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 : 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
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. [SDL 2.0] Conversion C++/SDL2 du tutoriel de présentation du tilemapping
    Par Eldergrim dans le forum SDL
    Réponses: 5
    Dernier message: 14/02/2014, 14h45
  2. Réponses: 40
    Dernier message: 30/04/2013, 14h11
  3. F.A.Q, Doc, cours, tutoriels sur JBuilder
    Par Ricky81 dans le forum JBuilder
    Réponses: 0
    Dernier message: 14/03/2002, 15h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo