Bonjour à tous!
Je suis nouvelle sur ce forum et j'ai besoin d'aide concernant un de mes programmes.
Pour résumer je suis le tutoriel de Mateo21 pour apprendre à programmer en C. Jusque là tout se passe bien mais j'ai programmé le Mario Sokoban (dans la partie 3 sur la SDL) mais code::block ne reconnaît pas une fonction que j'ai faite "jouer(SDL_Surface* ecran)". En fait dans mon main.c je l'utilise "jouer(ecran)" avec la surface ecran qui est bien déclarée au début du programme (SDL_Surface *ecran = NULL et la surface que j'ai bien réussi à charger à l'aide de SDL_SetVideoMode.
Pour éviter de trop charger mon main j'ai fait la fonction dans le fichier "jeu.c" avec le header "jeu.h" qui est bien inclu dans mon main etc. J'ai le même problème pour ma fonction "editeur(ecran)" mais ça doit être exactement le même problème.
Je vous mets le code de mon main.c, de ma fonction "jouer" et du header jeu.h

main.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
 
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL_image.h>
 
#include "constantes.h"
#include "jeu.h"
#include "editeur.h"
#include "fichiers.h"
 
int main(int argc, char* argv[])
{
    SDL_Surface *ecran = NULL, *menu = NULL;
    SDL_Rect positionMenu;
    SDL_Event event;
 
    int continuer = 1;
 
    if(SDL_Init(SDL_INIT_VIDEO) == -1)
    {
        fprintf(stderr, "Impossible de charger la SDL: %s\n", SDL_GetError());
        exit(EXIT_FAILURE);
    }
 
    SDL_WM_SetIcon(IMG_Load("caisse.jpg"), NULL);
 
    ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    if(ecran == NULL)
    {
        fprintf(stderr, "Impossible de charger le mode video: %s\n", SDL_GetError());
        exit(EXIT_FAILURE);
    }
    SDL_WM_SetCaption("Mario SOkoban", NULL);
 
    menu = IMG_Load("menu.jpg");
    positionMenu.x = 0;
    positionMenu.y = 0;
 
    while (continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
                break;
            case SDL_KEYDOWN:
                switch(event.key.keysym.sym)
                {
                    case SDLK_ESCAPE:
                        continuer = 0;
                        break;
                    case SDLK_KP1:
                        jouer(ecran);
                        break;
                    case SDLK_KP2:
                        editeur(ecran);
                        break;
                }
                break;
        }
    // Effacement de l'écran
    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
    SDL_BlitSurface(menu, NULL, ecran, &positionMenu);
    SDL_Flip(ecran);
    }
    SDL_FreeSurface(menu);
    SDL_Quit();
 
    return EXIT_SUCCESS;
}
jeu.h:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
void jouer(SDL_Surface* ecran);
void deplacerJoueur(int carte[] [NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction);
void deplacerCaisse(int *premiereCase, int *secondeCase);
code de jouer(ecran):
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
 
jouer(SDL_Surface* ecran)
{
    SDL_Surface *mario[4] = {NULL};
    SDL_Surface *mur = NULL, *caisse = NULL, *caisseOK = NULL, *objectif = NULL, *marioActuel = NULL;
    SDL_Rect position, positionJoueur;
    SDL_Event event;
 
    int continuer = 1, objectifsRestants = 0, i = 0, j = 0;
    int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};
 
    mur = IMG_Load("mur.jpg");
    caisse = IMG_Load("caisse.jpg");
    caisseOK = IMG_Load("caisse_ok.jpg");
    objectif = IMG_Load("objectif.png");
    mario[BAS] = IMG_Load("mario_bas.gif");
    mario[GAUCHE] = IMG_Load("mario_gauche.gif");
    mario[DROITE] = IMG_Load("mario_droite.gif"),
    mario[HAUT] = IMG_Load("mario_haut.gif");
 
    marioActuel = mario[BAS]; //Mario sera dirigé vers le bas au départ//
 
    //Chargement du niveau
    if (!chargerNiveau(carte))
        exit(EXIT_FAILURE);
 
    //Recherche de la position de Mario au départ
    for(i = 0; i <NB_BLOCS_LARGEUR; i++)
    {
        for (j = 0; j <NB_BLOCS_HAUTEUR; j++)
        {
            if(carte[i][j] == MARIO) //Si Mario se trouve à cette position
            {
                positionJoueur.x = i;
                positionJoueur.y = j;
                carte[i][j] = VIDE;
            }
        }
    }
 
    //Activation de la répétition des touches
    SDL_EnableKeyRepeat(100,100);
 
    //Boucle principale
    while(continuer)
    {
        switch(event.type)
        {
        case SDL_QUIT:
            continuer = 0;
            break;
        case SDL_KEYDOWN:
            switch(event.key.keysym.sym)
            {
            case SDLK_ESCAPE:
                continuer = 0;
                break;
            case SDLK_UP:
                marioActuel = mario[HAUT];
                deplacerJoueur(carte, &positionJoueur, HAUT);
                break;
            case SDLK_DOWN:
                marioActuel = mario[BAS];
                deplacerJoueur(carte, &positionJoueur, HAUT);
                break;
            case SDLK_RIGHT:
                marioActuel = mario[DROITE];
                deplacerJoueur(carte, &positionJoueur, DROITE);
                break;
            case SDLK_LEFT:
                marioActuel = mario[GAUCHE];
                deplacerJoueur(carte, &positionJoueur, GAUCHE);
                break;
            }
 
            break;
        }
        //Effacement de l'écran
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
 
            // Placement des objets à l'écran
            objectifsRestants = 0;
 
            for(i = 0; i < NB_BLOCS_LARGEUR; i++)
            {
                for(j = 0; j < NB_BLOCS_HAUTEUR; j++)
                {
                    position.x = i * TAILLE_BLOC;
                    position.y = j * TAILLE_BLOC;
 
                    switch(carte[i][j])
                    {
                    case MUR:
                        SDL_BlitSurface(mur, NULL, ecran, &position);
                        break;
                    case CAISSE:
                        SDL_BlitSurface(caisse, NULL, ecran, &position);
                        break;
                    case CAISSE_OK:
                        SDL_BlitSurface(caisseOK, NULL, ecran, &position);
                        break;
                    case OBJECTIF:
                        SDL_BlitSurface(objectif, NULL, ecran, &position);
                        objectifsRestants = 1;
                        break;
                    }
                }
            }
            //Si on n'a trouvé aucun objectif sur la carte c'est qu'on a gagné
            if(!objectifsRestants)
                continuer = 0;
 
            //On place le joueur à la bonne position
            position.x = positionJoueur.x * TAILLE_BLOC;
            position.y = positionJoueur.y * TAILLE_BLOC;
            SDL_BlitSurface(marioActuel, NULL, ecran, &position);
 
            SDL_Flip(ecran);
    }
    //Désactivation de la répétition des touches (remises à 0)
    SDL_EnableKeyRepeat(0,0);
 
    //Libération des surfaces chargées
    SDL_FreeSurface(mur);
    SDL_FreeSurface(caisse);
    SDL_FreeSurface(caisseOK);
    SDL_FreeSurface(objectif);
    for(i = 0; i < 4; i++)
        SDL_FreeSurface(mario[i]);
}
Désolée pour le pavé ^^'