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

 C++ Discussion :

Utilisation d'un tableau comme variable de classe (static)


Sujet :

C++

  1. #1
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 078
    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 078
    Points : 2 338
    Points
    2 338
    Par défaut Utilisation d'un tableau comme variable de classe (static)
    Bonjour,


    Je vous expose mon probleme :

    Je voudrai mettre un tableau 2D de SDL_Surface* en variable de class afin que chaque instance puisse y acceder.

    Seulement, je n'y arrive pas

    J'ai regarder dans la FAQ, j'arrive a faire comme l'exemple mais cet exemple ne traite que d'une simple variable de type int.

    Mon probleme ne s'arrete pas la. J'ai besoins d'utiliser des variable temporaire afin de correctement charger mon tableau. J'ai aussi besoins d'appeler bon nombre de fonction.


    Or, ce type d'initialisation de variable de class est nouveau pour moi. J'ai deja essayer, mais cela ne marchait pas
    (expected constructor, destructor, or type conversion before '=' token)

    Mais bon, je vois a peu pres d'ou vient cette erreur. Non, ce qui me bloqie vraiment, c'est vraiment la marche a suivre.

    Voila la declaration de la variable static :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Asteroid
    {
        public:
     
            /* Methode */
     
            static SDL_Surface* RessourceSprite[4][135][29];
     
        protected:
     
            /* attribut */
    };
    Et voici la fonction qui se chargait d'initialiser RessourceSprite avant que je ne decide de la mettre en variable de class :

    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
     
    void CreationListeAnimationAsteroid(SDL_Surface* RessourceSprite[4][135][29])
    {
        /* Cette SDL_Surface servira juste a mettre les bpp des image chargé
           au meme niveau que celui de l'ecran */
        SDL_Surface *Temporaire = NULL;
     
     
     
        /* On commence par les sprite des asteroids */
     
        /* Variables utilisées juste pour le sprite "Asteroid" */
        SDL_Surface *Decoupage = NULL;
        SDL_Rect positionSprite;
            positionSprite.w = 80;
            positionSprite.h = 80;
     
        /* On charge et converti l'image */
        Temporaire = SDL_LoadBMP("./Ressources/Asteroid/Asteroid.bmp");
        if (Temporaire == NULL)
        {
            cout << "Probleme lors du chargement d'un sprite de la fonction \"CreationListeAnimationAsteroid\" : " << SDL_GetError() << endl;
            exit(EXIT_FAILURE);
        }
        Decoupage = SDL_DisplayFormat(Temporaire);
     
     
        /* On commence par creer le modele */
        for (int i=0 ; i<4 ; i++)
            for (int j=0 ; j<29 ; j++)
            {
                /* Creation de la surface, remplissage et definition de la couleur
                   transparente pour les trois type d'asteroid */
                for (int k=0 ; k<3 ; k++)
                {
                    /* Creation de la surface */
                    RessourceSprite[i][k*45][j] = SDL_CreateRGBSurface(SDL_HWSURFACE, 32+k*24, 32+k*24, ECRAN_BPP, 0, 0, 0, 0);
                    if (RessourceSprite[i][k*45][j] == NULL)
                    {
                        cout << "Probleme lors de l'allocation d'une surface de la fonction \"CreationListeAnimationAsteroid\" : " << SDL_GetError() << endl;
                        exit(EXIT_FAILURE);
                    }
     
                    /* remplissage de la couleur de transparence */
                    SDL_FillRect(RessourceSprite[i][k*45][j], NULL, 0xFF00FF);
     
                    /*  Definition de la transparence */
                    SDL_SetColorKey(RessourceSprite[i][k*45][j], SDL_SRCCOLORKEY | SDL_RLEACCEL, 0xFF00FF);
                }
     
                /* Choix du sprite a copier depuis le sprite "Asteroid" */
                positionSprite.x = j*80;
                positionSprite.y = i*80;
     
                SDL_BlitSurface(Decoupage, &positionSprite, RessourceSprite[i][90][j], NULL);
                sge_transform(RessourceSprite[i][90][j], RessourceSprite[i][0][j], 0, 0.4, 0.4, 40, 40, 16, 16, 0);
                sge_transform(RessourceSprite[i][90][j], RessourceSprite[i][45][j], 0, 0.7, 0.7, 40, 40, 28, 28, 0);
            }
     
        /* Une fois le modele créé, on n'a plus besoin de l'image "Asteroid" et de positionSprite */
        SDL_FreeSurface(Decoupage);
     
     
        /* A partir de ce modele, on va creer des serie de sprite comme ceux
           du modele mais incliné de 8° a chaque fois */
        for (int i=0 ; i<4 ; i++)
            for (int j=0 ; j<29 ; j++)
                for (int k=1 ; k<45 ; k++)
                    for (int l=0 ; l<3 ; l++)
                    {
                        /* Creation de la surface */
                        RessourceSprite[i][l*45+k][j] = SDL_CreateRGBSurface(SDL_HWSURFACE, 32+l*24, 32+l*24, ECRAN_BPP, 0, 0, 0, 0);
                        if (RessourceSprite[i][l*45+k][j] == NULL)
                        {
                            cout << "Probleme lors de l'allocation d'une surface de la fonction \"CreationListeAnimationAsteroid\" : " << SDL_GetError() << endl;
                            exit(EXIT_FAILURE);
                        }
     
     
                        /* remplissage de la couleur de transparence */
                        SDL_FillRect(RessourceSprite[i][l*45+k][j], NULL, 0xFF00FF);
     
                        /*  Definition de la transparence */
                        SDL_SetColorKey(RessourceSprite[i][l*45+k][j], SDL_SRCCOLORKEY | SDL_RLEACCEL, 0xFF00FF);
     
                        /* Appliquation de la rotation */
                        sge_transform(RessourceSprite[i][90][j], RessourceSprite[i][l*45+k][j], k*8, 0.4+l*0.3, 0.4+l*0.3, 40, 40, 16+l*12, 16+l*12, 0);
                    }
     
     
        SDL_FreeSurface(Temporaire);
    }
    Donc, ma problématique se resume a ceci :

    est il possible d'appeler cette fonction pour initialiser la variable de class ?
    Si non, est-il possible de "traduire" cette fonction pour qu'elle initialise la variable de class.
    Si non, est-il seulement possible d'initialiser la variable de class dans ces conditions ?

    Voila, merci de votre lecture.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Pour référencer une variable de classe en dehors d'une fonction de la classe, tu dois préciser la classe à laquelle elle appartient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class ma_class
    {
    public:
       static type ma_variable;
    };
     
    void initialise_ma_variable_de_ma_classe()
    {
       ma_class::ma_variable = type();
    }
    Je n'ai pas lu tout ton code, mais je soupçonne que le problème réside dans le type de ta variable de classe : SDL_Surface* RessourceSprite[4][135][29]. C'est sensé représenter quoi ?

  3. #3
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 078
    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 078
    Points : 2 338
    Points
    2 338
    Par défaut
    Bonjour,

    SDL_Surface* RessourceSprite[4][135][29] est censer representer un tableau 3D de pointeur sur structure SDL_Surface.

    Le malloc est fait grace a la fonction SDL_LoadBMP ou SDL_CreateRGBSurface(...);

    Bon, je vais essayer de faire ce code avec la syntaxe proposer.
    Je vous tient au courant (dans une semaine environ).


    Merci de ton aide.

  4. #4
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 078
    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 078
    Points : 2 338
    Points
    2 338
    Par défaut
    Bon, j'ai finalement reussi a faire ce que je voulais tant bien que mal.

    C'est plutot difficile d'utiliser les variable de class au debut ...

    Voici comment on peut initialiser et utiliser un tableau (3D en l'occurence) de pointeur sur structure :


    Le .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
     
    #ifndef ASTEROID_H
    #define ASTEROID_H
     
    #include <SDL/SDL.h>
     
    class Asteroid
    {
    /**************  o------------------------o  ***************
    ***************  |   Variable de classe   |  ***************
    ***************  o------------------------o  **************/
     
        public:
     
        static SDL_Surface* ListeAnimation[4][135][29];
     
    };
     
    void CreationListeAnimationAsteroid();
     
    #endif
    Le .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
     
    #include "Asteroid.h"
     
    using namespace std;
     
    /* Initialisation des variable de classe (static) */
    SDL_Surface* Asteroid::ListeAnimation[4][135][29] = {{NULL},{NULL},{NULL}};
     
     
    void CreationListeAnimationAsteroid()
    {
        /* Cette SDL_Surface servira juste a mettre les bpp des image chargé
           au meme niveau que celui de l'ecran */
        SDL_Surface *Temporaire = NULL;
     
     
     
        /* On commence par les sprite des asteroids */
     
        /* Variables utilisées juste pour le sprite "Asteroid" */
        SDL_Surface *Decoupage = NULL;
        SDL_Rect positionSprite;
            positionSprite.w = 80;
            positionSprite.h = 80;
     
        /* On charge et converti l'image */
        Temporaire = SDL_LoadBMP("./Ressources/Asteroid/Asteroid.bmp");
        if (Temporaire == NULL)
        {
            cout << "Probleme lors du chargement d'un sprite de la fonction \"CreationListeAnimationAsteroid\" : " << SDL_GetError() << endl;
            exit(EXIT_FAILURE);
        }
        Decoupage = SDL_DisplayFormat(Temporaire);
     
        /* On commence par creer le modele */
        for (int i=0 ; i<4 ; i++)
            for (int j=0 ; j<29 ; j++)
            {
                /* Creation de la surface, remplissage et definition de la couleur
                   transparente pour les trois type d'asteroid */
                for (int k=0 ; k<3 ; k++)
                {
                    /* Creation de la surface */
                    Asteroid::ListeAnimation[i][k*45][j] = SDL_CreateRGBSurface(SDL_HWSURFACE, 32+k*24, 32+k*24, ECRAN_BPP, 0, 0, 0, 0);
                    if (Asteroid::ListeAnimation[i][k*45][j] == NULL)
                    {
                        cout << "Probleme lors de l'allocation d'une surface de la fonction \"CreationListeAnimationAsteroid\" : " << SDL_GetError() << endl;
                        exit(EXIT_FAILURE);
                    }
     
                    /* remplissage de la couleur de transparence */
                    SDL_FillRect(Asteroid::ListeAnimation[i][k*45][j], NULL, 0xFF00FF);
     
                    /*  Definition de la transparence */
                    SDL_SetColorKey(Asteroid::ListeAnimation[i][k*45][j], SDL_SRCCOLORKEY | SDL_RLEACCEL, 0xFF00FF);
                }
     
                /* Choix du sprite a copier depuis le sprite "Asteroid" */
                positionSprite.x = j*80;
                positionSprite.y = i*80;
     
                SDL_BlitSurface(Decoupage, &positionSprite, Asteroid::ListeAnimation[i][90][j], NULL);
                sge_transform(Asteroid::ListeAnimation[i][90][j], Asteroid::ListeAnimation[i][0][j], 0, 0.4, 0.4, 40, 40, 16, 16, 0);
                sge_transform(Asteroid::ListeAnimation[i][90][j], Asteroid::ListeAnimation[i][45][j], 0, 0.7, 0.7, 40, 40, 28, 28, 0);
            }
     
        /* Une fois le modele créé, on n'a plus besoin de l'image "Asteroid" et de positionSprite */
        SDL_FreeSurface(Decoupage);
     
     
        /* A partir de ce modele, on va creer des serie de sprite comme ceux
           du modele mais incliné de 8° a chaque fois */
        for (int i=0 ; i<4 ; i++)
            for (int j=0 ; j<29 ; j++)
                for (int k=1 ; k<45 ; k++)
                    for (int l=0 ; l<3 ; l++)
                    {
                        /* Creation de la surface */
                        Asteroid::ListeAnimation[i][l*45+k][j] = SDL_CreateRGBSurface(SDL_HWSURFACE, 32+l*24, 32+l*24, ECRAN_BPP, 0, 0, 0, 0);
                        if (Asteroid::ListeAnimation[i][l*45+k][j] == NULL)
                        {
                            cout << "Probleme lors de l'allocation d'une surface de la fonction \"CreationListeAnimationAsteroid\" : " << SDL_GetError() << endl;
                            exit(EXIT_FAILURE);
                        }
     
     
                        /* remplissage de la couleur de transparence */
                        SDL_FillRect(Asteroid::ListeAnimation[i][l*45+k][j], NULL, 0xFF00FF);
     
                        /*  Definition de la transparence */
                        SDL_SetColorKey(Asteroid::ListeAnimation[i][l*45+k][j], SDL_SRCCOLORKEY | SDL_RLEACCEL, 0xFF00FF);
     
                        /* Appliquation de la rotation */
                        sge_transform(Asteroid::ListeAnimation[i][90][j], Asteroid::ListeAnimation[i][l*45+k][j], k*8, 0.4+l*0.3, 0.4+l*0.3, 40, 40, 16+l*12, 16+l*12, 0);
                    }
     
     
        SDL_FreeSurface(Temporaire);
    }
    Voila, la fonction CreationListeAnimationAsteroid() est une fonction permettant d'initialiser le tableau static.
    Elle est appelé depuis le main une unique fois.


    Merci pour tout (3DArchi )

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

Discussions similaires

  1. Utilisation d'un tableau d'une autre classe
    Par karamovic dans le forum Collection et Stream
    Réponses: 15
    Dernier message: 14/09/2013, 10h29
  2. Utilisation d'un tableau d'une autre classe
    Par karamovic dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 13/09/2013, 11h15
  3. [XL-2010] (VBA) Utiliser nom de feuille comme variable
    Par Kaera dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 22/11/2011, 08h06
  4. [Tableaux] Nom d'entrée tableau comme variable
    Par vigon dans le forum Langage
    Réponses: 3
    Dernier message: 09/08/2007, 09h45
  5. Réponses: 4
    Dernier message: 28/11/2006, 09h50

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