Problème de fonction

Fermé
leoufdu78170 - 2 juil. 2013 à 17:55
 leoufdu78170 - 3 juil. 2013 à 14:17
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;
    }

4 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
3 juil. 2013 à 09:35
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
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 vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
3 juil. 2013 à 14:14
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
Je vais étudier ça, merci !
0