Bonsoir,

mon titre n'étant pas clair, je vais vous expliquer mon probleme :

Je code en C++ mais je n'utilise pas la POO. J'utilise encore les structure.
Voici mon probleme :

Je veux creer un jeu dans lequel on controle un vaisseau.

Le vaisseau possede des arme (differente) et les arme utilise des munition (differente elle aussi). Cepandant, une arme ne possede qu'un seul type de munition.

Afin de ne pas faire des SDL_LoadBMP pour chaque arme (alors que plusieurs d'entre elle utilise le même type de munition), j'ai creer un tableau de type Projectile récapitulant les differentes munitions.

STRUCTURE DU PROJECTILE
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
 
typedef enum NomProjectile
{
    BALLE,
    MISSILE,
    AUCUNE,
    NombreProjectile = 3
 
};
 
 
typedef struct DefinitionProjectile
{
    /* Caracteristiques fixe de la munition */
    SDL_Surface *image;
    float vitesse;
    int dommage;
    int dureeDeVie;
 
    /* Caracteristiques données par l'arme */
    float angle;
    float debutX;
    float debutY;
    float positionX;
    float positionY;
 
    /* Gestion de la liste chainée */
    struct DefinitionProjectile *precedent;
    struct DefinitionProjectile *suivant;
 
}Projectile, *pProjectile;

CREATION DU TABLEAU
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
 
void CreationListeProjectiles(Projectile *ListeProjectile)
{
    /* Cette surface servira a charger les image des projectile afin que
      la conversion au BPP de l'ecran puisse ce faire */
    SDL_Surface *temporaire;
 
 
    if ((temporaire = SDL_LoadBMP("./Ressources/Projectile/Balle.bmp")) == NULL)
    {
        cerr << "Impossible de charger l'image \"Balle\" du dossier \"Ressources/Projectile\" : " << SDL_GetError() << ".\n";
        exit(EXIT_FAILURE);
    }
    if ((ListeProjectile[BALLE].image = SDL_DisplayFormat(temporaire)) == NULL)
    {
        cerr << "Probleme lors de la conversion de l'image \"Balle\" du dossier \"Ressources/Projectile\" : " << SDL_GetError() << ".\n";
        exit(EXIT_FAILURE);
    }
    cout << "Image \"Balle\" du dossier \"Ressources/Projectile\" completement initialisé.\n";
    ListeProjectile[BALLE].vitesse = 150;
    ListeProjectile[BALLE].dommage = 3;
    ListeProjectile[BALLE].dureeDeVie = 700;
 
 
    if ((temporaire = SDL_LoadBMP("./Ressources/Projectile/Missile.bmp")) == NULL)
    {
        cerr << "Impossible de charger l'image \"Missile\" du dossier \"Ressources/Projectile\" : " << SDL_GetError() << ".\n";
        exit(EXIT_FAILURE);
    }
    if ((ListeProjectile[MISSILE].image = SDL_DisplayFormat(temporaire)) == NULL)
    {
        cerr << "Probleme lors de la conversion de l'image \"Missile\" du dossier \"Ressources/Projectile\" : " << SDL_GetError() << ".\n";
        exit(EXIT_FAILURE);
    }
    if ((SDL_SetColorKey(ListeProjectile[MISSILE].image, SDL_SRCCOLORKEY | SDL_RLEACCEL, 0xFF00FF)) == -1)
    {
        cerr << "Probleme lors de l'introduction de la transparence pour l'image \"Missile\" du dossier \"Ressources/Projectile\" : " << SDL_GetError() << ".\n";
        exit(EXIT_FAILURE);
    }
    cout << "Image \"Missile\" du dossier \"Ressources/Projectile\" completement initialisé.\n";
    ListeProjectile[MISSILE].vitesse = 90;
    ListeProjectile[MISSILE].dommage = 15;
    ListeProjectile[MISSILE].dureeDeVie = 400;
 
 
    ListeProjectile[AUCUNE].image = NULL;
    ListeProjectile[AUCUNE].vitesse = 0;
    ListeProjectile[AUCUNE].dommage = 0;
    ListeProjectile[AUCUNE].dureeDeVie = 0;
 
    SDL_FreeSurface(temporaire);
}


Ce tableau est utilisé pour la creation des armes, definie ci dessous :

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
 
typedef enum NomArme
{
    LANCE_ROQUETTE,
    LANCE_MISSILE,
    UF_45,
    RAPTOR,
    VIDE,
    NombreArme = 5
 
};
 
 
typedef struct DefinitionArme
{
 
    /* Caracteristique fixe de l'arme */
    std::string nom;
    Projectile munition;
    float cadence;
    /*
    int munition;
    int tempsRechargement;
    */
 
    /* Caracteristique fixé en debut de round */
    /* Angle de tir en radian */
    float angleDeTir;
 
}Arme, *pArme;
Une arme a donc une munition, et non un pointeur de munition.


CREATION DE LA LISTE D'ARME
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
 
void CreationListeArmes (Arme *ListeArme)
{
    /* On obtient les differentes munitions possible */
    Projectile ListeProjectile[NombreProjectile];
    CreationListeProjectiles(ListeProjectile);
 
 
    /* On creer toutes les armes */
    ListeArme[LANCE_ROQUETTE].nom = "Lance Roquette";
    ListeArme[LANCE_ROQUETTE].munition = ListeProjectile[MISSILE];
    ListeArme[LANCE_ROQUETTE].cadence = 80;
 
 
    ListeArme[LANCE_MISSILE].nom = "Lance Missile";
    ListeArme[LANCE_MISSILE].munition = ListeProjectile[MISSILE];
    ListeArme[LANCE_MISSILE].cadence = 20;
 
 
    ListeArme[UF_45].nom = "UF 45";
    ListeArme[UF_45].munition = ListeProjectile[BALLE];
    ListeArme[UF_45].cadence = 990;
 
 
    ListeArme[RAPTOR].nom = "Raptor";
    ListeArme[RAPTOR].munition = ListeProjectile[BALLE];
    ListeArme[RAPTOR].cadence = 678;
 
 
    ListeArme[VIDE].nom = "vide";
    ListeArme[VIDE].munition = ListeProjectile[AUCUNE];
    ListeArme[VIDE].cadence = 0;
 
 
 
    //DestructionListeProjectiles(ListeProjectile);
 
    /* Les surface sont totalement desalloue :/
    SDL_BlitSurface(ListeProjectile[MISSILE].image,NULL,SDL_GetVideoSurface(),NULL);
    SDL_Flip(SDL_GetVideoSurface());
    Sleep(2000);*/
 
}
Le probleme vient du fait que lorsque je libere l'image (avec la fonction DestructionListeProjectiles(ListeProjectile); qui est commenter ) des munitions, seule l'image de la balle peut etre blitter, mais pas celle du missile.

Voici (enfin) mes question :


* Si je libere (avec DestructionListeProjectiles(ListeProjectile)) les SDL_Surface, est que cette liberation affectera egalement les armes ?

** Si oui, comment faire un sorte que cela n'arrive pas ? Doit on faire une sorte de duplicata ?

* Pourquoi une des deux image seulement n'est plus disponible ? Pourquoi les deux image n'agissent pas de la meme maniere ??

Voila, merci de m'avoir lu.