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 :

Charger une map 2D pour un jeu.


Sujet :

SDL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2009
    Messages : 35
    Points : 28
    Points
    28
    Par défaut Charger une map 2D pour un jeu.
    Bonjour,je suis en train de créer un jeu 2D,mais pour cela j'avais de besoin de me pratiquer en créant un 2eme projet pour quelque test.Donc j'essaie de faire remplir un fenêtre avec seulement deux image différente.
    J'ai créer un fichier text ou il y a 36 caractère,tous des zero et des un.
    Mais j'arrive pas a avoir le résulta voulu.Je crois que le problème viens de la lecture du text.
    Si vous pouvez m'aider???
    voici mon code C++.

    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
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include <SDL.h>
    #include <SDL_image.h>
     
    #define BLOCK_LARGEUR 107
    #define BLOCK_HAUTEUR 80
     
    #define NB_BLOCS_LARGEUR    6
    #define NB_BLOCS_HAUTEUR    6
    #define LARGEUR_FENETRE     BLOCK_LARGEUR * NB_BLOCS_LARGEUR
    #define HAUTEUR_FENETRE     BLOCK_HAUTEUR* NB_BLOCS_HAUTEUR
     
     
    using namespace std;
     
    int main(int argc,char** argv)
    {
     
        SDL_Surface *ecran = NULL, *Terre = NULL, *Vide =NULL;
        SDL_Rect position;
        SDL_Event event;
        int Map[6][6];
        bool continuer = true;
        char caractere;
     
        SDL_Init(SDL_INIT_VIDEO);
     
        ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_WM_SetCaption("Map", NULL);
     
        SDL_EnableKeyRepeat(10, 10);
     
        SDL_ShowCursor(SDL_DISABLE);
     
        Terre = IMG_Load("Terre.bmp");
        Vide = IMG_Load("Vide.bmp");
     
     
        ifstream FichierMap("Map1.txt", ios::in);
     
     
     
     
        while (FichierMap.get(caractere))
        {
            for (int x=0;x<NB_BLOCS_LARGEUR;x++)
            {
                for (int y=0;y<NB_BLOCS_HAUTEUR;y++)
                {
                    if (caractere == '0')
                    {
                        Map[x][y] = 0;
     
                    }
                    else if (caractere == '1')
                    {
                        Map[x][y] = 1;
     
                    }
                }
            }
     
        }
     
     
        while (continuer)
        {
     
            for (int i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
            {
                for (int j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
                {
                    position.x = i * BLOCK_LARGEUR;
                    position.y = j * BLOCK_HAUTEUR;
     
                    switch (Map[i][j])
                    {
                    case 1:
                        SDL_BlitSurface(Terre, NULL, ecran, &position);
                        break;
                    case 0:
                        SDL_BlitSurface(Vide, NULL, ecran, &position);
                        break;
                    }
                }
            }
     
            SDL_Flip(ecran);
            SDL_WaitEvent(&event);
            switch (event.type)
            {
            case SDL_QUIT:
                SDL_Quit();
                exit(0);
                break;
            }
     
     
     
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
     
     
     
        }
        FichierMap.close();
        SDL_FreeSurface(ecran);
        SDL_Quit();
     
        return 0;
    }
    J'aimerais bien réussir a faire un scrolling avec ça.J'ai regarder sur google mais je comprend rien,la plupart des page sont en anglais de toute façon.
    Merci quand meme d'avoir lue mon message.

  2. #2
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    si tu as un problèmes tu devrais déjà vérifier toutes les étapes, par exemple est-ce que le fichier est bien ouvert, est-ce qu'il y a bien que des 0 et des 1, ... tout ça en faisant des 'std::cout' de ce qui se passe pour en avoir une trace, voire dire "map[0][0]: Terre, map[1][0]: Vide, ..." pour voir tout ce que tu as en mémoire et vérifier que c'est bon.

    Ensuite dis-nous quel est le problème que tu as?

    Si tu ne trouves toujours pas, essaie au lieu de charger la map d'un fichier de le faire d'une chaîne de caractère codée en brut dans le programme pour voir si le problème vient du chargement du fichier ou pas.

    Si ça ne marche pas encore, remplace les SDL_BlitSurface(...) par des SDL_FillRect (de deux couleurs différentes) comme ça ce sera plus simple pour nous de tester ton programme, on n'aura qu'un seul fichier à compiler et pas d'autres fichiers à mettre

  3. #3
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Il est clair que tu devrais tester si tes fonction renvoie le resultat obtenue.

    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
     
        while (FichierMap.get(caractere))
        {
            for (int x=0;x<NB_BLOCS_LARGEUR;x++)
            {
                for (int y=0;y<NB_BLOCS_HAUTEUR;y++)
                {
                    if (caractere == '0')
                    {
                        Map[x][y] = 0;
     
                    }
                    else if (caractere == '1')
                    {
                        Map[x][y] = 1;
     
                    }
                }
            }
    peut se simplifier de cet facon :

    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
     
        while (FichierMap.get(caractere))
            for (int x=0;x<NB_BLOCS_LARGEUR;x++)
                for (int y=0;y<NB_BLOCS_HAUTEUR;y++)
                    if (caractere == '0')
                        Map[x][y] = 0;
                    else
                        Map[x][y] = 1;
     
      /* Ensuite tu test si tu as bien ce que tu desirer */
      for (int x=0;x<NB_BLOCS_LARGEUR;x++)
      {
           for (int y=0;y<NB_BLOCS_HAUTEUR;y++)
                 cout << Map[x][y];
           cout << endl;
       }
    Tu execute une fois ce test et tu regarde dans ta sortie standart ensuite si tu as bien ce que tu desisrer et non un resultat incoherent.
    Si ton resultat est incoherent :
    Verifie le fichier source en lui meme ( normalement, tu as 36 chiffre binaire sans espace aligné)
    Verifie le retour de la fonction
    ifstream FichierMap("Map1.txt", ios::in);

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2009
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    Voici le contenu du fichier.

    000000000000000000000000000011111111

    Ouai,y'a un truc bizarre.Je lance le mode debug.
    Je met des break point a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while (FichierMap.get(caractere))
            for (int x=0;x<NB_BLOCS_LARGEUR;x++)
                for (int y=0;y<NB_BLOCS_HAUTEUR;y++)
                    if (caractere == '0')
                ici>       Map[x][y] = 0;
                    else
                  ici>      Map[x][y] = 1;
                  ici>
    Puis je regarde la valeur des variable du tableau Map et de x et y.
    Toute les variable de Map prenne 0!Même si le texte fini par des 1.Puis le for(int x=0;x<NB_BLOCS_LARGEUR;x++) semble tourner en rond a l'infini.
    A ce moment j'enlève le premier breakpoint.A ce moment la flèche jaune du debugueur va plus loin que le if (caractere == '0') Map[x][y] = 0;.Elle n'allait pas plus loin avant.Et il se passe la même chose,mais cette fois si toute les valeur de Map prenne un!Étrange non...Le problème provient vraiment de while (FichierMap.get(caractere)).

  5. #5
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Hum,

    Donc si je comprend bien, tu n'arrive pas a extraire ta map de ton fichier.
    Peut-on voir la fonction membre get de FichierMap ?

    Essaye par contre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            for (int x=0;x<NB_BLOCS_LARGEUR;x++)
                for (int y=0;y<NB_BLOCS_HAUTEUR;y++)
                    if (FichierMap.get(caractere) == '0')
                        Map[x][y] = 0;
                    else
                        Map[x][y] = 1;
    Je pense que cela devrait suffire. En effet, tes trois boucle imbrique ne font pas du tout ce que tu veux.
    Avec le premier while, tu récupéré un caractère, puis avec les deux boucle for, tu assigne ce caractère a toute ta variable Map.

  6. #6
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    As-tu testé que le fichier est bien ouvert?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ifstream FichierMap("Map1.txt", ios::in);
     
    if (!FichierMap)
    {
        cout << "ouverture ratée!" << endl;
        exit(0);
    }
    As-tu essayé de faire commencer le fichier par des 1 pour voir ce qu'il se passe?

    As-tu essayé de charger le fichier entièrement dans une chaine/une string et de regarder le contenu de la chaine?

    SoftEvans:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        for (int x=0;x<NB_BLOCS_LARGEUR;x++)
                for (int y=0;y<NB_BLOCS_HAUTEUR;y++)
                    if (FichierMap.get(caractere) == '0')
                        Map[x][y] = 0;
                    else
                        Map[x][y] = 1;
    FichierMap.get renvoie une référence vers le fichier, et non pas le caractère extrait, donc ça ne marchera pas.

    Par contre tu peux faire:

    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
    for (int x=0;x<NB_BLOCS_LARGEUR;x++)
    {
    	for (int y=0;y<NB_BLOCS_HAUTEUR;y++)
    	{
    		if (FichierMap.get(caractere))
    			if (caractere == '0') {
    				Map[x][y] = 0;
    				cout << "remplissage de Map[" << x << "][" << y "] à 0" << endl;
    			} else if (caractere == '1') {
    				Map[x][y] = 1;
    				cout << "remplissage de Map[" << x << "][" << y "] à 1" << endl;
    			} else {
    				cout << "caractère inconnu ( " << caractere << ") rencontré." << endl;
                                   exit(1);
    			}
    		else {
    			cout << "impossible de lire le caractère, erreur avec le fichier." << endl;
    			exit(1);
    		}
    	}
    }

  7. #7
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SoftEvans:
     
    Code :
     
        for (int x=0;x<NB_BLOCS_LARGEUR;x++)
                for (int y=0;y<NB_BLOCS_HAUTEUR;y++)
                    if (FichierMap.get(caractere) == '0')
                        Map[x][y] = 0;
                    else
                        Map[x][y] = 1;
     
    FichierMap.get renvoie une référence vers le fichier, et non pas le caractère extrait, donc ça ne marchera pas.

    Au temps pour moi.

    Je n'ai jamais encore utilisé un ifstream, donc je ne savais pas. J'aurais dû me renseigner avant. Mea Culpa.


    PS : Mais pourquoi tout le monde met un t a SofEvans ???

    Edit : c'est pas grave, mais c'est troublant a la fin

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2009
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    OK Merci sa marche comme je le vouais avec ce code:
    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
    ifstream FichierMap("Map1.txt", ios::in);
     
    if (!FichierMap)
    {
        cerr << "ouverture ratée!" << stdout;
        exit(0);
    }
     
     for (int x=0;x<NB_BLOCS_LARGEUR;x++)
    {
    	for (int y=0;y<NB_BLOCS_HAUTEUR;y++)
    	{
    		if (FichierMap.get(caractere))
    			if (caractere == '0')
    			{
    				Map[x][y] = 0;
     
    			}
    			else if (caractere == '1')
    			{
    				Map[x][y] = 1;
     
    			}
    			else
    			 {
    				cerr << "caractère inconnu ( " << caractere << ") rencontré." << stdout;
                                   exit(1);
    			}
    		else {
    			cerr << "impossible de lire le caractère, erreur avec le fichier." << stdout;
    			exit(1);
    		}
    	}
    }
    En étudiant plus fstream,je vais surement pouvoir faire un éditeur de map.Car là,ce n'est pas évidant de savoir ou placer les chiffre.Je vais aussi ajouter d'autre chiffre pour différente chose.Comme l'apparition du personnage.

    Mais,est ce que vous auriez une petite idée pour faire un scrolling dans ce genre de map là???

  9. #9
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    @ SofEvans: C'est juste que quand on parle anglais assez souvent, ça devient quasiment le prolongement logique et quand on lit rapidement, on peut le mettre inconsciemment.

    Et sinon tu avais trouvé le problème (qui était en fait de charger tout avec le premier caractère qu'on a pris), même dans mon post d'avant où j'ai repris ton code j'étais complètement passé à côté ...

    @Itachi:
    Vu que l'ordinateur possède une grande quantité de mémoire, tu peux charger en mémoire la carte sous forme "010011001..." en entier ou presque. Quand tu seras plus loin tu pourras utiliser un format plus évolué de fichier pour donner plus d'information (largeur, hauteur de la map) et mieux stocker, mais pour l'instant je ne sais pas si c'est encore le moment, de toute façon tu pourras changer ta fonction qui s'occupe du chargement de la map.

    Pour le scrolling tu fais un rectangle caméra qui représente la zone affichée par rapport à ta map et tu te débrouille pour afficher les bon blocs correspondant au rectangle caméra, si jamais tu as des problèmes postes ton code qui ne marche pas, mais normalement après quelques essais ça devrait marcher.

    Pour le fichier c'est un problème différent, il faudrait faire une sorte de format de fichier pour que tout aille bien.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2009
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    Ok,ouai.Ce projet là c'était juste un genre de test pour pouvoir utiliser cette technique dans mon vrai projet.Je me suis dit qu'avec un plus petit code ça serait plus facile de debuger et voire ou sont les erreur.Je compte faire un jeu de combat 2D de Naruto.C'est mon premier(gros projet pour moi) de ce genre.Alors ça aurait été la galère pour démêler tout ça avec mes classes.lol

    Je vais surement mettre un genre de variable membre dans ma classe,du genre m_LimiteSol pour gérer les collision.Surtout que j'ai de besoin de gérer les collision pour mon saut.

    Je sais pas si je de vrais faire un truc différant des mur et des sol.

  11. #11
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Commence par faire un truc simple qui marche, puis complique
    Ne fais rien dont tu n'as pas encore besoin.

    C'est peut-être pas la meilleure manière, mais au moins t'as déjà un truc basique qui marche et tu peux voir l'évolution de ton programme assez régulièrement.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2009
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    ok.
    Là j'ai fais une class map.
    J'arrive pas a mettre mon m_fichier map dans mes attribut(Je suis plus trop sur si on appelle sa comme ça.lol).
    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
    #ifndef CMAP_H_INCLUDED
    #define CMAP_H_INCLUDED
     
    #include <iostream>
    #include <string>
    #include <fstream>
     
    #include <SDL.h>
    #include <SDL_image.h>
     
    class Map
    {
        public:
     
        void LoadMap(std::string NomMap);
        void BlitMap();
        void CloseMap();
     
        private:
     
        char m_caractere;
        int m_Map[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR];
     std::ifstream m_FichierMap;<-----Ici je sais pas trop si c'est ca qu'il faut faire
     SDL_Surface *m_Terre, *m_Vide;
    SDL_Rect m_position;
    };
     
    #endif // CMAP_H_INCLUDED
    Je sais pas non plus comment faire pour blitter là,parce que mon ecran est dans mon implémentation.

    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
    #define BLOCK_LARGEUR 40
    #define BLOCK_HAUTEUR 30
     
    #define NB_BLOCS_LARGEUR    16
    #define NB_BLOCS_HAUTEUR    16
    #define LARGEUR_FENETRE     BLOCK_LARGEUR * NB_BLOCS_LARGEUR
    #define HAUTEUR_FENETRE     BLOCK_HAUTEUR* NB_BLOCS_HAUTEUR
     
    #include "CMap.h"
     
    using namespace std;
     
    void Map::LoadMap(string NomMap)
    {
         m_FichierMap(NomMap, ios::in);
     
    if (!m_FichierMap)
    {
        cerr<< "ouverture ratée!" << stdout;
        exit(0);
    }
     
     
     
    for (int x=0;x<NB_BLOCS_LARGEUR;x++)
    {
    	for (int y=0;y<NB_BLOCS_HAUTEUR;y++)
    	{
    		if (m_FichierMap.get(m_caractere))
    			if (m_caractere == '0')
    			{
    				m_Map[x][y] = 0;
     
    			}
    			else if (m_caractere == '1')
    			{
    				m_Map[x][y] = 1;
     
    			}
    			else
    			 {
    				cerr << "caractère inconnu ( " << m_caractere << ") rencontré." << stdout;
                                   exit(1);
    			}
    		else {
    			cerr << "impossible de lire le caractère, erreur avec le fichier." << stdout;
    			exit(1);
    		}
    	}
    }
     
    }
     
    void Map::BlitMap()
    {
     
     
            for (int i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
            {
                for (int j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
                {
                    m_position.x = i * BLOCK_LARGEUR;
                    m_position.y = j * BLOCK_HAUTEUR;
     
                    switch (m_Map[i][j])
                    {
                    case 1:
                        SDL_BlitSurface(m_Terre, NULL, ecran, &m_position);
                        break;
                    case 0:
                        SDL_BlitSurface(m_Vide, NULL, ecran, &m_position);
                        break;
                    }
                }
     
            }
     
    }
     
    void Map::CloseMap()
    {
      m_FichierMap.close();
    }
    Quelqu'un peu me dire a quoi sert la deuxième variable(mon gros NULL) dans le SDL__BlitSurface(m_Vide, NULL, ecran, &m_position);

  13. #13
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    La deuxieme variable de SDL_BlitSurface est un SDL_Rect.
    Elle sert a savoir quelle partie de ton image source tu va prendre.
    Quand tu le met a NULL, cela veut dire que tu prend tout.

    voici un lien (encore le meme) qui devrait t'aider :
    http://www.gnurou.org/files/images/S...g4.preview.png


    Pour ton doute, je dirais ceci :

    Hola ????
    Mais je croyais que ifstream representer le fichier ????
    Si j'ai bien suivi, ton Map[6][6] doit prendre les valeur contenue dans le fichier afin de representer la map. Donc ifstream n'a rien a faire ici.

    Donc, dans ton .hpp tu enleve std::ifstream m_FichierMap; et dans ton .cpp, au debut de ta fonction tu le met au dessus de m_FichierMap(NomMap, ios::in);

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2009
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    J'ai réussi a régler moi-même le truc d'envoyé mon ecran dans mon implémentation.

    J'ai mis:
    void Map::BlitMap(SDL_Surface *Surface)
    Alors j'envoie mon ecran dans Surface.J'espère que ça va marcher.

    Mais ifstream est un type de variable tenu d'un template.Je n'ai pas vraiment le choix de le mettre non?

    J'ai fais ce que tu m'a dis.Mais j'aime rais bien pouvoirs choisir ma map en écrivant directement le nom.

    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
    class Map
    {
        public:
     
        void LoadMap(std::string* NomMap);
        void BlitMap(SDL_Surface *Surface);
     
     
        private:
     
        char m_caractere;
        int m_Map[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR];
     
     SDL_Surface *m_Terre, *m_Vide;
    SDL_Rect m_position;
    };
    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
    void Map::LoadMap(string NomMap)
    {
     
     
      std::ifstream m_FichierMap(NomMap, ios::in);
     
    if (!m_FichierMap)
    {
        cerr<< "ouverture ratée!" << stdout;
        exit(0);
    }
     
     
    for (int x=0;x<NB_BLOCS_LARGEUR;x++)
    {
    	for (int y=0;y<NB_BLOCS_HAUTEUR;y++)
    	{
    		if (m_FichierMap.get(m_caractere))
    			if (m_caractere == '0')
    			{
    				m_Map[x][y] = 0;
     
    			}
    			else if (m_caractere == '1')
    			{
    				m_Map[x][y] = 1;
     
    			}
    			else
    			 {
    				cerr << "caractère inconnu ( " << m_caractere << ") rencontré." << stdout;
                                   exit(1);
    			}
    		else {
    			cerr << "impossible de lire le caractère, erreur avec le fichier." << stdout;
    			exit(1);
    		}
    	}
    }
    m_FichierMap.close();
    }
    P.S.:J'ai modifier le nombre de case et la grandeur.C'est maintenant 16x16 avec des sprites de 40x30pix.La classe marche très bien.Mais j'aimerais pouvoir écrire le nom de la map a charger avec un string.Ca compile pas.

  15. #15
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    SDL_GetVideoSurface(); te renvoie ta surface ecran, donc pas besoins de te la trimballer a travers tes fonction.

    Mais ifstream est un type de variable tenu d'un template.Je n'ai pas vraiment le choix de le mettre non?
    Je n'en sait rien du tout
    J'ai fait comme si ifstream etait une variable. Ca devrait marcher.

    J'ai fais ce que tu m'a dis.Mais j'aime rais bien pouvoirs choisir ma map en écrivant directement le nom.
    Ben, c'est exactement ce que tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     void LoadMap(std::string* NomMap);
    NomMap est le nom de ton fichier, donc de ta map. Si tu veux ouvrir plusieurs map differente, il te suffit de passer le nom du fichier approprier.
    Par contre, je ne sais pas pourquoi tu as declarer un pointeur sur string.

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2009
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    Sa marche pas.
    H
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Map
    {
        public:
     
        void LoadMap(std::string NomMap);
    /*autre code*/
    }
    CPP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Map::LoadMap(string NomMap)
    {
      std::ifstream m_FichierMap(NomMap, ios::in);
    /*autre code*/
    Main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Map MapTest;
     
    MapTest.LoadMap("Map1.txt");
    In member function `void Map::LoadMap(std::string)'
    error: no matching function for call to `std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(std::string&, const std::_Ios_Openmode&)'|
    note: candidates are: std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(const std::basic_ifstream<char, std::char_traits<char> >&)|
    note:std::basic_ifstream<_CharT, _Traits>::basic_ifstream(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>]|
    note: std::basic_ifstream<_CharT, _Traits>::basic_ifstream() [with _CharT = char, _Traits = std::char_traits<char>]|
    ||=== Build finished: 1 errors, 0 warnings ===|

    ifstream est vraiment un typedef.T'a qu'a voir le fichier iosfwd.

  17. #17
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    http://www.developpez.net/forums/d27...-membre-class/

    Trouvé grâce a Google et developpez .... en 8 seconde.
    Est-tu sûr de te donner tous les moyens ?

    Bref, apparemment, ta réponse est dans ce lien.

    Si tu n'arrive pas a faire ton scrolling, dis moi comment tu l'envisage, je pourrait t'aider.

    Bon courage pour la suite

  18. #18
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Pour ton premier problème, il faut utiliser MaString.c_str() pour transformer une string en const char*.

    www.cppreference.com, tu as tout sur les strings et les streams (dans C++ I/O)

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2009
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    Merci.Je sens que cette référence va beaucoup m'aider.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Génération d'une grille puzzle pour un jeu vidéo avec gestion de difficulté
    Par CaNiBaLe dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 04/07/2014, 16h49
  2. [PHP 4] Problème création d'une Map pour un jeu
    Par kazylax dans le forum Langage
    Réponses: 3
    Dernier message: 13/05/2011, 13h57
  3. Charger une Map
    Par DoNotReply dans le forum DirectX
    Réponses: 4
    Dernier message: 21/10/2010, 15h41
  4. Gestion d'une map pour jeu 2D
    Par G'rominet dans le forum Développement 2D, 3D et Jeux
    Réponses: 40
    Dernier message: 13/07/2009, 10h49
  5. Création d'une carte géographqiue pour un jeu.
    Par Space Cowboy dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/03/2007, 12h26

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