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

Développement 2D, 3D et Jeux Discussion :

Gestionnaire de ressources


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 75
    Points : 26
    Points
    26
    Par défaut Gestionnaire de ressources
    Bonjour,

    En continuant le travail commencé ici :
    http://www.developpez.net/forums/sho...d.php?t=378352

    Pour essayer de limiter les chargements, et pour pouvoir avoir l'illusion que mon joueur se tourne vers la direction où il va, j'ai essayer de coder quelque chose mais apparement cela ne marche pas :

    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
     
     
    static SDL_Surface *joueur=NULL,*joueur2=NULL;
        static SDL_Surface *joueur_bas=NULL,*joueur_haut=NULL,*joueur_gauche=NULL,*joueur_droite=NULL;
        static SDL_Surface *joueur_bas2=NULL,*joueur_haut2=NULL,*joueur_gauche2=NULL,*joueur_droite2=NULL;
        static int test=RIEN;
     
    if(joueur_bas==NULL)
        {
            joueur_bas=IMG_Load("Images/Personnages/ninja_bas.bmp");
            joueur_bas2=IMG_Load("Images/Personnages/ninja_bas2.bmp");
            joueur_haut=IMG_Load("Images/Personnages/ninja_haut.bmp");
            joueur_haut2=IMG_Load("Images/Personnages/ninja_haut2.bmp");
            joueur_droite=IMG_Load("Images/Personnages/ninja_droite.bmp");
            joueur_droite2=IMG_Load("Images/Personnages/ninja_droite2.bmp");
            joueur_gauche=IMG_Load("Images/Personnages/ninja_gauche.bmp");
            joueur_gauche2=IMG_Load("Images/Personnages/ninja_gauche2.bmp");
     
            SDL_SetColorKey(joueur_gauche,SDL_SRCCOLORKEY,SDL_MapRGB(joueur->format,69,103,137));
            SDL_SetColorKey(joueur_gauche2,SDL_SRCCOLORKEY,SDL_MapRGB(joueur2->format,69,103,137));
            SDL_SetColorKey(joueur_droite,SDL_SRCCOLORKEY,SDL_MapRGB(joueur->format,69,103,137));
            SDL_SetColorKey(joueur_droite2,SDL_SRCCOLORKEY,SDL_MapRGB(joueur2->format,69,103,137));
            SDL_SetColorKey(joueur_bas,SDL_SRCCOLORKEY,SDL_MapRGB(joueur->format,69,103,137));
            SDL_SetColorKey(joueur_bas2,SDL_SRCCOLORKEY,SDL_MapRGB(joueur2->format,69,103,137));
            SDL_SetColorKey(joueur_haut,SDL_SRCCOLORKEY,SDL_MapRGB(joueur->format,69,103,137));
            SDL_SetColorKey(joueur_haut2,SDL_SRCCOLORKEY,SDL_MapRGB(joueur2->format,69,103,137));
        }
        if(test!=deplacement) /*si le joueur a bougé*/
         {
           switch(deplacement)
           {
             case RIEN :
                  joueur=joueur_bas;
                  joueur2=joueur_bas2;
                  break; 
     
             case BAS : 
                  joueur=joueur_bas;
                  joueur2=joueur_bas2;
                  break;
     
             case HAUT:
                  joueur=joueur_haut;
                  joueur2=joueur_haut2;
                  break;
     
             case DROITE:
                  joueur=joueur_droite;
                  joueur2=joueur_droite2;
                  break;
             case GAUCHE:
                  joueur=joueur_gauche;
                  joueur2=joueur_gauche2;
                  break;
     
             default:
                  break;
           }          
         }
     
         test=deplacement;
    Copier une surface dans une autre est interdit ?

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Désolé, mais je refuse de porter cette utilisation de variable static à un autre niveau

    Si tu veux continuer ton projet avec mon aide, il va falloir faire quelque chose de plus propre.

    Exercice avant de continuer :

    Un gestionnaire de ressource nettement plus propre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    /* Définition des différentes constantes */
    enum {VIDE, MONTAGNE,EAU,HERBE, JOUEUR_BAS, JOUEUR_BAS_SEL,
              JOUEUR_HAUT, JOUEUR_HAUT_SEL, 
              JOUEUR_DROITE, JOUEUR_DROITE_SEL,
              JOUEUR_GAUCHE, JOUEUR_GAUCHE_SEL,
              };
     
    /* Fonction retournant la ressource voulu en la chargeant UNE seule fois */
    SDL_Surface* gestion_chercheRessource(int i);
     
    /* Fonction qui vide les ressources */
    void gestion_videRessources();
    Avec une jolie fonction qui retourne la surface en la chargeant une seule fois. Donc si j'appelle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SDL_Surface *tmp = gestion_chercheRessource(EAU);
    SDL_Surface *tmp2 = gestion_chercheRessource(JOUEUR_HAUT);
    SDL_Surface *tmp3 = gestion_chercheRessource(EAU);
    La fonction charge seulement une fois la surface EAU et une fois le joueur direction haut.

    Au boulot ! Fais d'abord marcher ma dernière version en utilisant ceci. Cela veut dire, qu'à part la fonction gestion_chercheRessource, plus personne a le droit d'utiliser IMG_LoadBMP.

    Bonne chance,
    Jc

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 75
    Points : 26
    Points
    26
    Par défaut
    Désolé, mais je refuse de porter cette utilisation de variable static à un autre niveau
    Grumpf !

    La fonction charge seulement une fois la surface EAU et une fois le joueur direction haut.
    J'utilise les variables statiques, est ce encore impropre ou c'est une bonne idée ?

    Sinon, j'ai un problème dans ma fonction de chargement, mon compilo me dis que je retourne une mauvaise valeur.

    Je pense que c'est du à ce que je retourne un pointeur de tableau de type SDL_Surface et qu'il attend juste une variable de type SDL_Surface, mais je ne sais pas quelle est la sémantique pour dire qu'on retourne un pointeur de tableau

    Quand a ma deuxième fonction, elle pose un petit problème. Pour pouvoir libéré toutes les surfaces, il faut qu'elle soit déja connus par cette fonction. Et donc je vais être obliger de tous les charger. *cours chercher un aspirine*

    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
    SDL_Surface gestion_chercheRessource(int i)
    {
         static SDL_Surface *surface[15]={NULL};
         switch(i)
         {
                  case MER:
                       if(surface[12]==NULL)
                       {
                          surface[12]=IMG_Load("Images/Terrains/mer.bmp");
                          SDL_SetColorKey(surface[12], SDL_SRCCOLORKEY, SDL_MapRGB(surface[12]->format,69,103,137));
                       }
                       break;
     
                  default:
                       break; 
         }
         return surface[i]; /*type incompatible */
    }
    void gestion_videRessource()
    {
     
    }

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par lapos
    J'utilise les variables statiques, est ce encore impropre ou c'est une bonne idée ?
    Dans ce cas, une variable statique interne au fichier (et non interne à la fonction) est la solution.

    Sinon, j'ai un problème dans ma fonction de chargement, mon compilo me dis que je retourne une mauvaise valeur.
    Normal, t'as oublié un * à la signature de la fonction.

    Quand a ma deuxième fonction, elle pose un petit problème. Pour pouvoir libéré toutes les surfaces, il faut qu'elle soit déja connus par cette fonction.
    Et oui du coup, il faut utiliser une variable statique au fichier et non à la fonction...

    Dans constantes.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /* Définition des différentes constantes */
    enum {VIDE, MONTAGNE,EAU,HERBE, JOUEUR_BAS, JOUEUR_BAS_SEL,
              JOUEUR_HAUT, JOUEUR_HAUT_SEL, 
              JOUEUR_DROITE, JOUEUR_DROITE_SEL,
              JOUEUR_GAUCHE, JOUEUR_GAUCHE_SEL,
              NBR_SURFACES
              };
    Dans gestion.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
     
    static SDL_Surface *surface[NBR_SURFACES]={NULL};
     
    SDL_Surface gestion_chercheRessource(int i)
    {
        /* Si la surface n'est pas presente */
        if(surface[i]==NULL) {
            /* On la charge */
            switch(i)
            {
                case MER:
                    surface[i]=IMG_Load("Images/Terrains/mer.bmp");
     
                    if(surface[i] == NULL) {
                        /* Gestion erreur a ajouter */
                        return NULL;
                    }
     
                    SDL_SetColorKey(surface[i], SDL_SRCCOLORKEY, SDL_MapRGB(surface[i]->format,69,103,137));
                    break;
     
                default:
                    break; 
            }
        }
        return surface[i]; 
    }
     
    void gestion_videRessource()
    {
    }
    Est-ce que comme cela tu arrives à finir ?

    Jc

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 75
    Points : 26
    Points
    26
    Par défaut
    Est-ce que comme cela tu arrives à finir ?
    Je pense que oui merci.

    J'ai recodé un peu, et j'arrive a une erreur que je n'arrive pas a résoudre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     mer=gestion_chercheRessource(MER);
    Et mon compilo me dis :

    C:\Dev-Cpp\Projet\Jeu\test_gestionnaire_image\carte.c In function `scrolling':
    60 C:\Dev-Cpp\Projet\Jeu\test_gestionnaire_image\carte.c incompatible types in assignment
    C:\Dev-Cpp\Projet\Jeu\test_gestionnaire_image\Makefile.win [Build Error] [carte.o] Error 1
    Voici mes fonctions :

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <SDL/SDL_ttf.h>
    #include <SDL/SDL_getenv.h>  
    #include <FMOD/fmod.h>
     
    #include "constantes.h"
    #include "fichier.h"
     
    static SDL_Surface *surface[15]={NULL};
     
    SDL_Surface* gestion_chercheRessource(int i)
    {
        if(surface[i]==NULL)
        {        
            switch(i)
            {
                  case MER:
                       surface[i]=IMG_Load("Images/Terrains/mer.bmp");
                       SDL_SetColorKey(surface[i], SDL_SRCCOLORKEY, SDL_MapRGB(surface[i]->format,69,103,137));
     
                       if(surface[i]==NULL)
                       {
                            erreur_image(MER);               
                       }
                       break;
     
                  default:
                       break; 
            }
         }
          return surface[i];
    }
     
    void gestion_videRessource()
    {
     
    }
    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
    void erreur_image(int i)
    {
      FILE *fichier=fopen("erreur.txt","w");
      if(fichier!=NULL)
      {
         switch(i)
         {
                  case MER:
                       fprintf(fichier,"erreur de chargement de  l'image mer.bmp");
                       break;
                  default:
                       break;
         }              
      }  
      fclose(fichier);  
    }

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par lapos
    J'ai recodé un peu, et j'arrive a une erreur que je n'arrive pas a résoudre :
    As-tu bien fait un .h qui contient le prototype et tu l'inclu depuis le fichier qui s'en sert ?

    Aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <SDL/SDL_ttf.h>
    #include <SDL/SDL_getenv.h>  
    #include <FMOD/fmod.h>
    Pourquoi autant d'include ?

    Ce serait bien de faire un fichier gestion.c qui est indépendant. Donc tu n'a que besoin de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    A priori.

    3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static SDL_Surface *surface[15]={NULL};
    Utilise ma solution d'enum pour avoir un champs NBR_SURFACES déclaré à la fin du enum, c'est mieux pour la gestion du code...

    4)
    Cette vérification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                    if(surface[i]==NULL)
                       {
                            erreur_image(MER);               
                       }
    doit être faite avant l'utilisation de SDL_SetColorKey sinon elle ne sert pas à grand chose.

    5)
    Le prototype de la fonction erreur_image est-elle bien définie avant la déclaration de la fonction gestion_ChercheRessource ?

    Jc

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 75
    Points : 26
    Points
    26
    Par défaut
    As-tu bien fait un .h qui contient le prototype et tu l'inclu depuis le fichier qui s'en sert ?
    Oui je l'inclus dans carte.c

    Pourquoi autant d'include ?
    J'ai pris l'habitude d'inclure tout ça pour être sur que je n'utiliserais pas de fonction non définie. N'est ce pas mieu ?

    Utilise ma solution d'enum pour avoir un champs NBR_SURFACES déclaré à la fin du enum, c'est mieux pour la gestion du code...
    C'est noté.

    doit être faite avant l'utilisation de SDL_SetColorKey sinon elle ne sert pas à grand chose.
    Je change ça de suite.

    Le prototype de la fonction erreur_image est-elle bien définie avant la déclaration de la fonction gestion_ChercheRessource ?
    Je pense, vu que de toute façon j'inclus le fichier fichier.h

    (en fait j'ai trouvé ou était l'erreur, j'avais oublié de modifier le prototype, il retournais toujours une surface au lieu d'un pointeur de surface )

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 75
    Points : 26
    Points
    26
    Par défaut
    Voilà, j'ai fini de coder mes fonctions, et je pense qu'elles marchent parfaitement :

    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
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <SDL/SDL_ttf.h>
    #include <SDL/SDL_getenv.h>  
    #include <FMOD/fmod.h>
     
    #include "constantes.h"
    #include "fichier.h"
     
    static SDL_Surface *surface[NBR_SURFACE]={NULL};
     
    SDL_Surface* gestion_chercheRessource(int i)
    {
        SDL_Surface *surfaceJ[NBR_SURFACE]={NULL};
        if(surface[i]==NULL)
        {        
            switch(i)
            {
                  case MER:
                       surface[i]=IMG_Load("Images/Terrains/mer.bmp");
                       if(surface[i]==NULL)
                       {
                            erreur_image(MER);               
                       }
                       SDL_SetColorKey(surface[i], SDL_SRCCOLORKEY, SDL_MapRGB(surface[i]->format,69,103,137));
                       break;
     
                  case HERBE:
                       surface[i]=IMG_Load("Images/Terrains/herbe.bmp");
                       if(surface[i]==NULL)
                       {
                            erreur_image(HERBE);               
                       }
                       SDL_SetColorKey(surface[i], SDL_SRCCOLORKEY, SDL_MapRGB(surface[i]->format,69,103,137));
                       break;
     
                  case LAC:
                       surface[i]=IMG_Load("Images/Terrains/lac.bmp");
                       if(surface[i]==NULL)
                       {
                            erreur_image(LAC);               
                       }
                       SDL_SetColorKey(surface[i], SDL_SRCCOLORKEY, SDL_MapRGB(surface[i]->format,69,103,137));
                       break;
     
                  case MONTAGNE:
                       surface[i]=IMG_Load("Images/Terrains/montagne.bmp");
                       if(surface[i]==NULL)
                       {
                            erreur_image(MONTAGNE);               
                       }
                       SDL_SetColorKey(surface[i], SDL_SRCCOLORKEY, SDL_MapRGB(surface[i]->format,69,103,137));
                       break;
     
                  case JOUEUR_BAS:
                       surface[i]=IMG_Load("Images/Personnages/ninja_bas.bmp");
                       if(surface[i]==NULL)
                       {
                            erreur_image(JOUEUR_BAS);               
                       }
                       SDL_SetColorKey(surface[i], SDL_SRCCOLORKEY, SDL_MapRGB(surface[i]->format,69,103,137));
                       break;
     
                  case JOUEUR_BAS_SEL:
                       surface[i]=IMG_Load("Images/Personnages/ninja_bas2.bmp");
                       if(surface[i]==NULL)
                       {
                            erreur_image(JOUEUR_BAS_SEL);               
                       }
                       SDL_SetColorKey(surface[i], SDL_SRCCOLORKEY, SDL_MapRGB(surface[i]->format,69,103,137));
                       break;
     
                  case JOUEUR_HAUT:
                       surface[i]=IMG_Load("Images/Personnages/ninja_haut.bmp");
                       if(surface[i]==NULL)
                       {
                            erreur_image(JOUEUR_HAUT);               
                       }
                       SDL_SetColorKey(surface[i], SDL_SRCCOLORKEY, SDL_MapRGB(surface[i]->format,69,103,137));
                       break;
     
                  case JOUEUR_HAUT_SEL:
                       surface[i]=IMG_Load("Images/Personnages/ninja_haut2.bmp");
                       if(surface[i]==NULL)
                       {
                            erreur_image(JOUEUR_HAUT_SEL);               
                       }
                       SDL_SetColorKey(surface[i], SDL_SRCCOLORKEY, SDL_MapRGB(surface[i]->format,69,103,137));
                       break;
     
                  case JOUEUR_DROITE:
                       surface[i]=IMG_Load("Images/Personnages/ninja_droite.bmp");
                       if(surface[i]==NULL)
                       {
                            erreur_image(JOUEUR_DROITE);               
                       }
                       SDL_SetColorKey(surface[i], SDL_SRCCOLORKEY, SDL_MapRGB(surface[i]->format,69,103,137));
                       break;
     
                  case JOUEUR_DROITE_SEL:
                       surface[i]=IMG_Load("Images/Personnages/ninja_2.bmp");
                       if(surface[i]==NULL)
                       {
                            erreur_image(JOUEUR_DROITE_SEL);               
                       }
                       SDL_SetColorKey(surface[i], SDL_SRCCOLORKEY, SDL_MapRGB(surface[i]->format,69,103,137));
                       break;
     
                  case JOUEUR_GAUCHE:
                       surface[i]=IMG_Load("Images/Personnages/ninja_gauche.bmp");
                       if(surface[i]==NULL)
                       {
                            erreur_image(JOUEUR_GAUCHE);               
                       }
                       SDL_SetColorKey(surface[i], SDL_SRCCOLORKEY, SDL_MapRGB(surface[i]->format,69,103,137));
                       break;
     
                  case JOUEUR_GAUCHE_SEL:
                       surface[i]=IMG_Load("Images/Personnages/ninja_gauche2.bmp");
                       if(surface[i]==NULL)
                       {
                            erreur_image(JOUEUR_GAUCHE_SEL);               
                       }
                       SDL_SetColorKey(surface[i], SDL_SRCCOLORKEY, SDL_MapRGB(surface[i]->format,69,103,137));
                       break;
     
                  case CASE:
                       surface[i]=IMG_Load("Images/Terrains/case.bmp");
                       if(surface[i]==NULL)
                       {
                            erreur_image(CASE);               
                       }
                       SDL_SetColorKey(surface[i], SDL_SRCCOLORKEY, SDL_MapRGB(surface[i]->format,69,103,137));
                       break;
     
                  case CASE_SELECTIONNEE:
                       surface[i]=IMG_Load("Images/Terrains/case_selectionnee.bmp");
                       if(surface[i]==NULL)
                       {
                            erreur_image(CASE_SELECTIONNEE);               
                       }
                       SDL_SetColorKey(surface[i], SDL_SRCCOLORKEY, SDL_MapRGB(surface[i]->format,69,103,137));
                       break;
     
                  default:
                       break; 
            }
            return surface[i];
         }
     
     
         if(surface[i]!=NULL)
         {
            surfaceJ[i]=surface[i];
            return surfaceJ[i];               
         }
    }
     
    void gestion_videRessource()
    {
        int i=0;
     
        for(i=0;i<NBR_SURFACE;i++)
        {
          SDL_FreeSurface(surface[i]);
        }
    }
    Maintenant, j'obtien un nouveau problème. A cause de ce morceau de 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
    35
    36
    37
    38
    39
    if(joueur==NULL)
        {
             joueur=gestion_chercheRessource(JOUEUR_BAS);
             joueur2=gestion_chercheRessource(JOUEUR_BAS_SEL);
        }
        if(test!=deplacement) /*si le joueur a bougé*/
         {
           switch(deplacement)
           {
             case RIEN :
                  joueur=gestion_chercheRessource(JOUEUR_BAS);
                  joueur2=gestion_chercheRessource(JOUEUR_BAS_SEL);
                  break; 
     
             case BAS : 
                  joueur=gestion_chercheRessource(JOUEUR_BAS);
                  joueur2=gestion_chercheRessource(JOUEUR_BAS_SEL);
                  break;
     
             case HAUT:
                  joueur=gestion_chercheRessource(JOUEUR_HAUT);
                  joueur2=gestion_chercheRessource(JOUEUR_HAUT_SEL);
                  break;
     
             case DROITE:
                  joueur=gestion_chercheRessource(JOUEUR_DROITE);
                  joueur2=gestion_chercheRessource(JOUEUR_DROITE_SEL);
                  break;
     
             case GAUCHE:
                  joueur=gestion_chercheRessource(JOUEUR_GAUCHE);
                  joueur2=gestion_chercheRessource(JOUEUR_GAUCHE_SEL);
                  break;
     
             default:
                  break;
           }          
     
         }
    C'est d'ailleur logique, vu que dans ma fonction gestion_chercheRessource, j'interdis de recharger une image.

    J'ai essayer de coder quelque chose mais apparement cela ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(surface[i]!=NULL)
         {
            surfaceJ[i]=surface[i];
            return surfaceJ[i];               
         }
    Donc je répete ma question :

    Copier une surface dans une autre est interdit ?

  9. #9
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par lapos
    C'est d'ailleur logique, vu que dans ma fonction gestion_chercheRessource, j'interdis de recharger une image.
    Non, c'est parce que tu n'as pas compris après le potentiel de ces nouvelles fonctions.

    J'attache un nouveau .zip qui contient ton code ajouté au projet et intégré proprement.

    Je te laisse découvrir le code.

    Jc

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 75
    Points : 26
    Points
    26
    Par défaut
    Oula, je sens que je vais choper un mal de crane

    La programmation est vraiment incompréhensible des fois

    J'ai modifié ma fonction gestion_chercheRessource pour qu'elle soit comme la tienne, mais j'ai toujours une erreur lorsque je change d'image.

    Mais en regardant ton code, j'ai vu que toi aussi tu rechargeait des images

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for(i=starty; i < stopy; i++) 
        {
            for(j=startx; j < stopx; j++) 
            {
                position.x=(j-startx)*TAILLE_BLOC;
                position.y=(i-starty)*TAILLE_BLOC;                            
     
                surf = gestion_chercheRessource(carte[i][j]);
     
                SDL_BlitSurface(surf, NULL, ecran, &position);
            }
        }
    Je ne comprend pas comment tu y arrive et pas moi

    Et au passage, que veut dire cette ligne ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_FreeSurface(gestion_surfaces[i]), gestion_surfaces[i] = NULL;

  11. #11
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par lapos
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for(i=starty; i < stopy; i++) 
        {
            for(j=startx; j < stopx; j++) 
            {
                position.x=(j-startx)*TAILLE_BLOC;
                position.y=(i-starty)*TAILLE_BLOC;                            
     
                surf = gestion_chercheRessource(carte[i][j]);
     
                SDL_BlitSurface(surf, NULL, ecran, &position);
            }
        }
    Attention, juste parce que je demande à gestion_chercheRessource de me donner la ressource ne veut pas dire que je recharge la ressource.

    Si tu regardes l'implémentation de cette fonction, tu verras que le chargement ne se fait qu'une fois...

    Et au passage, que veut dire cette ligne ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_FreeSurface(gestion_surfaces[i]), gestion_surfaces[i] = NULL;
    [/quote]
    C'est une facon propre d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SDL_FreeSurface(gestion_surfaces[i]);
     gestion_surfaces[i] = NULL;
    L'avantage réside dans le fait que personne ne va, par mégarde, utiliser le pointeur déjà désalloué vu qu'il vaudra tout de suite NULL...

    Jc

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 75
    Points : 26
    Points
    26
    Par défaut
    Je vien de remarquer un truc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_Surface* gestion_chercheRessource(unsigned int i)
    Pourquoi unsigned int et non pas int ?

    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
    SDL_Surface* gestion_chercheRessource(unsigned int i)
    {
        if(i < NBR_SURFACES) 
        {
            if(gestion_surfaces[i]==NULL)
            {        
                switch(i)
                {
                     case MER:
                       /*blabla*/
                }
             }
              return gestion_surfaces[i];
         }
      return NULL;
    }
    Attention, juste parce que je demande à gestion_chercheRessource de me donner la ressource ne veut pas dire que je recharge la ressource.
    Ce que je ne comprend pas, c'est que si tu a déja chargé une image, et que tu demande a gestion_chercheRessource de te donner la ressource, tu ne rentre pas dans la boucle du :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(gestion_surfaces[i]==NULL)
    Et donc aucune surface n'est délivré a la fonction qui appel cette fonction. Donc comment arrive tu a redonné la surface ?

    L'avantage réside dans le fait que personne ne va, par mégarde, utiliser le pointeur déjà désalloué vu qu'il vaudra tout de suite NULL...
    Ok, je vois a peu près.

  13. #13
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par lapos
    Je vien de remarquer un truc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_Surface* gestion_chercheRessource(unsigned int i)
    Pourquoi unsigned int et non pas int ?
    1) Cela m'évite de tester si i < 0
    2) Il n'y a pas de raison d'avoir un entier négatif donc pourquoi ne pas mettre un nombre unsigned...

    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
    SDL_Surface* gestion_chercheRessource(unsigned int i)
    {
        if(i < NBR_SURFACES) 
        {
            if(gestion_surfaces[i]==NULL)
            {        
                switch(i)
                {
                     case MER:
                       /*blabla*/
                }
             }
              return gestion_surfaces[i];
         }
      return NULL;
    }
    Ce que je ne comprend pas, c'est que si tu a déja chargé une image, et que tu demande a gestion_chercheRessource de te donner la ressource, tu ne rentre pas dans la boucle du :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(gestion_surfaces[i]==NULL)
    Et donc aucune surface n'est délivré a la fonction qui appel cette fonction. Donc comment arrive tu a redonné la surface ?
    En fait, l'idée est de conserver quelque part l'adresse et les données des ressources pour s'en servir plus tard. Les pointeurs sont stockés dans un tableau et la fonction regarde d'abord si la ressource est chargée (on le sait parce que si le pointeur != NULL, la ressource est chargée). Si elle est chargée, on retourne le pointeur vers celle-ci.

    Sinon on charge l'image et on met en place ce pointeur. Du coup, au prochain appel, on n'a plus besoin de le charger, vu qu'on a conserver cette adresse en mémoire.

    Est-ce plus clair ?
    Jc

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 75
    Points : 26
    Points
    26
    Par défaut
    1) Cela m'évite de tester si i < 0
    2) Il n'y a pas de raison d'avoir un entier négatif donc pourquoi ne pas mettre un nombre unsigned...
    C 'est vrai, c'est logique. C'est juste que je n'ai pas l'habitude d'utiliser autre chose que des int, long, ou double.

    Est-ce plus clair ?
    Oui, et c'est ce qui rend encore plus incompréhensible mon problème

    Pour être certain que je ne faisait pas d'erreur, j'ai repris intégralement ta fonction gestion_chercheRessource. Comme l'erreur continuait toujours, j'en ai conclus que cela ne pouvait être que de la faute a ma fonction scrolling.

    Donc, qu'est ce qui m'empeche de charger mes autres images ?

    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
     
        SDL_Surface *montagne=NULL,*mer=NULL,*herbe=NULL,*lac=NULL;
        SDL_Surface *joueur=NULL,*joueur2=NULL;
        static int test=RIEN;
     
        montagne=gestion_chercheRessource(MONTAGNE);
        herbe=gestion_chercheRessource(HERBE);
        lac=gestion_chercheRessource(LAC);
        mer=gestion_chercheRessource(MER);
     
     
        joueur=gestion_chercheRessource(JOUEUR_BAS);
        joueur2=gestion_chercheRessource(JOUEUR_BAS_SEL);
     
        if(test!=deplacement) /*si le joueur a bougé*/
         {
           switch(deplacement)
           {
             case RIEN :
                  joueur=gestion_chercheRessource(JOUEUR_BAS);
                  joueur2=gestion_chercheRessource(JOUEUR_BAS_SEL);
                  break; 
     
             case BAS : 
                  joueur=gestion_chercheRessource(JOUEUR_BAS);
                  joueur2=gestion_chercheRessource(JOUEUR_BAS_SEL);
                  break;
     
             case HAUT:
                  joueur=gestion_chercheRessource(JOUEUR_HAUT);
                  joueur2=gestion_chercheRessource(JOUEUR_HAUT_SEL);
                  break;
     
             case DROITE:
                  joueur=gestion_chercheRessource(JOUEUR_DROITE);
                  joueur2=gestion_chercheRessource(JOUEUR_DROITE_SEL);
                  break;
     
             case GAUCHE:
                  joueur=gestion_chercheRessource(JOUEUR_GAUCHE);
                  joueur2=gestion_chercheRessource(JOUEUR_GAUCHE_SEL);
                  break;
     
             default:
                  break;
           }          
     
         }
     
         test=deplacement;

  15. #15
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Il faut que tu testes si tu recois bien les surfaces aussi.

    Je rappelle que la fonction gestion_ChercheRessource retourne NULL s'il y a un problème.

    - As-tu regardé si le fichier erreur.txt a été créé ?
    - As-tu regardé si c'est un des retours de la fonction qui valait NULL ?

    Jc

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 75
    Points : 26
    Points
    26
    Par défaut
    - As-tu regardé si le fichier erreur.txt a été créé ?
    - As-tu regardé si c'est un des retours de la fonction qui valait NULL ?
    Oui, en fait c'était un problème de chargement d'une image. Je l'avais mal nommée tout simplement

    Il faut que tu testes si tu recois bien les surfaces aussi.
    Est ce vraiment necessaire ? (comment ça je suis flemmard )

    ------

    Maintenant, j'ai un scrolling en bon état, et deux fonctions qui vont bosser a ma place pour charger toutes mes images ( ).

    Je tenais à te remercier pour ton aide plus que précieuse !

    Je vais partir en vacance ( ) pendant 3 semaines donc je te laisse souffler avant de revenir te poser plein de questions toutes plus compliqué les unes que les autres *prépare déja une liste *

    Encore merci pour avoir pris du temps a m'aider, et surtout recoder mon programme.

    A une prochaine fois

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

Discussions similaires

  1. Gestionnaire de ressources
    Par Kromagg dans le forum Moteurs 3D
    Réponses: 4
    Dernier message: 05/06/2012, 23h45
  2. Gestionnaire de ressources sous Delphi 2010
    Par jackfirst72 dans le forum EDI
    Réponses: 0
    Dernier message: 15/04/2010, 08h39
  3. Mise à jour d'un Gestionnaire de Ressource
    Par -eXa- dans le forum C++
    Réponses: 7
    Dernier message: 06/08/2008, 08h28
  4. gestionnaire de ressources
    Par Plomeg dans le forum C++
    Réponses: 7
    Dernier message: 04/06/2008, 20h47
  5. [TUTO moteur 3D] gestionnaire de ressources
    Par new.proger dans le forum Développement 2D, 3D et Jeux
    Réponses: 6
    Dernier message: 29/06/2006, 20h55

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