Problème de fonction

leoufdu78170 -  
 leoufdu78170 -
Salut a tous !

Je code actuellement un petit RPG en C avec la lib graphique SDL.

Le jeu est presque fini d'être codé.
Je vais situer le problème.
Alors, le principe, c'est de se balader dans des donjons a la recherche d'artefact.
Dans ces donjons se trouvent des ennemis.
J'ai codé une fonction combat qui se déclenche lorsqu'il y a collision entre un ennemi et le héros.
La fonction combat renvoi 1 si le héros (nous) gagne ce combat.
Maintenant, le coeur du problème : lorsque je gagne mon combat, je n'arrives pas a retourner correctement dans le donjon, ça affiche le donjon, mais je ne peux plus bouger, le jeu plante.

Voila les parties du code concernées :

dans donjon.c, l'appel de combat :

for(i=0;i<nbEnnemis;i++)
        {
            if (mechant[i].vaincu ==0)
                afficherSprite(&mechant[i].rect,m,mechant[i].img,screen);
        }

        for(i=0;i<nbEnnemis;i++)
        {
            if (collisionEnemy(s->position,mechant[i].rect) && mechant[i].vaincu == 0)
            {
                if (combat(&s, &mechant[i])==1)
                    mechant[i].vaincu = 1;
                else
                    exit(0);
            }
        }

        reset(&vx,&vy);

        SDL_Flip(screen);
        displayMap(m,screen);


et dans combat.c, le test de victoire et le renvoi :

if (hero->PV <= 0)  // si le héros perd
    {
        victoire = 0;
        continuer = 0;
    }

    if (mechant->PV <= 0 )   // si le mechant perd
    {
        victoire = 1;
        continuer = 0;
    }
}


    //fin de la fonction combat
    SDL_FreeSurface(fond_map);
    SDL_FreeSurface(ecran);
    SDL_FreeSurface(img_pv);
    SDL_FreeSurface(img_pm);
    SDL_FreeSurface(img_ennemi);
    SDL_FreeSurface(img_daemon1);
    SDL_FreeSurface(img_daemon2);
    SDL_FreeSurface(boutonmenu);
    SDL_FreeSurface(boutonmenu2);
    SDL_FreeSurface(fondmenu);
    SDL_FreeSurface(pointeur);
    SDL_FreeSurface(img_pv);
    SDL_FreeSurface(img_pm);
    SDL_FreeSurface(boom);

    for(i;i=0;i<3,1)
    {
        SDL_FreeSurface(img_perso[i]);
    }

    for(i;i=0;i<20,1)
    {
        SDL_FreeSurface(text[i]);
    }

    if (victoire == 0)  // si le héros perd, gameover
        gameover();
    else                     // sinon, si le méchant perd, retourne 1
    {
        return 1;
    }
A voir également:

4 réponses

Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Salut.
Je ne connais pas SDL, mais j'ai peut être quelques pistes.
Si tu ne combats pas d'ennemis, le jeu fonctionne bien, c'est à dire que ton problème vient de la fonction combat.
Le truc que je vois qui peux faire merdé, ce sont tout les SDL_Free, tu doit modifier l'état du jeu et ça ne lui plait pas.
Ou alors c'est le passage d'argument à combat qui est mauvais. Je vois un "&s", là où je me serai attendu à simplement "s", car s est déjà un pointeur.
0
leoufdu78170
 
Yo ! Merci de t'intéresser au problème :)

Alors, déjà, c'est pas du au passage du pointeur, parce que la fonction combat fonctionne bien.

Je vais regarder du coté des free et freeSurface, ta peut être raison.

En fait, le jeu ne crash pas vraiment, mais la musique du combat reste, et le donjon réapparaît mais a moitié de la fenêtre (car je n'utilise pas le même résolution pour le combat que pour le donjon) et je ne peux plus bouger.

http://image.noelshack.com/fichiers/2013/27/1372850816-hh.png
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Le problème viens surement du changement de résolution. Lorsque tu sort de combat, à mon avis, il faut refaire une palanqué d'initialisation pour remettre tout dans le bon état.
je pense que ton problème est connu et a plusieurs solutions : http://www.bytehazard.com/code/sdlres.html
0
leoufdu78170
 
Je vais étudier ça, merci !
0