Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C/SDL]mario sokoban amelioré

des commentaire? suggestion?

    21 juillet 2007 à 1:18:28

    Salut,
    je viens de finaliser mon sokoban ameloré, et je voudrais savoir votre avis sur ma façon de faire.
    voila les sources + les images necessaires:
    le lien
    • Partager sur Facebook
    • Partager sur Twitter
      21 juillet 2007 à 4:10:33

      Tu pourrais tester le fait qu'une image soit bien ouverte ou pas.

      if(chargerNiveau(carte, *stage) == -1)
      {
              printf("impossible charger le niveau");
              exit(EXIT_FAILURE);
      }

      En cas d'erreur, comme ici, tu pourrais libérer les surfaces précédemment allouées via tes IMG_Load(), ça évite les fuites de mémoire (même si c'est la fin du programme, c'est toujours rassurant).

      Il y a de la "sur-indentation", des sauts de ligne inutiles.

      Je te déconseille l'utilisation des accents (même dans les commentaires), ça évite des warnings quand le compilo est bien configuré.
      • Partager sur Facebook
      • Partager sur Twitter
        21 juillet 2007 à 14:17:08

        je ne comprend pas si je dois liberer une surface si il n'as pas eté chargé d'origine.
        merci comme meme, s'il y a d' autres commentaires, je suis la.
        • Partager sur Facebook
        • Partager sur Twitter
          2 août 2007 à 21:25:09

          Citation : marox

          Je ne comprend sais pas si je dois libérer une surface si il elle n'as pas eté chargée d'origine.
          Merci comme quand même.


          Non, si elle n'a pas été chargée, il ne faut pas la libérer.

          Sinon, le fait de ne pas poster les sources directement ne pousse pas à regarder ton code... Les informaticiens sont (pour la plupart) féniants.
          • Partager sur Facebook
          • Partager sur Twitter
            2 août 2007 à 21:41:44

            d'accord. voila les sources:
            /*main.c*/
            /*fichier principal
            sert a choisir entre
            l'editeur et le jeu*/



            #include <stdio.h>
            #include <stdlib.h>
            #include <SDL/SDL.h>
            #include <SDL/SDL_image.h>
            #include "constantes.h"
            #include"jeu.h"



            int main(int arge, char *argv[])
            {

                    SDL_Surface *ecran = NULL, *menu = NULL, *emploiJeu = NULL, *emploiEditeur = NULL;
                    SDL_Event event;
                    int continuer = 1, stage = 0;
                   
                   
                    //initialisation de la SDL
                    if(SDL_Init(SDL_INIT_VIDEO) < 0)
                    {
                            printf("erreur SDL: %s\n", SDL_GetError());
                            exit(EXIT_FAILURE);
                    }

                    //donner l'icone du jeu
                    SDL_WM_SetIcon(IMG_Load("images/mario_bas.gif"), NULL);

                    //donner un titre
                     SDL_WM_SetCaption("Mario Sokoban", "mario");

                    //ouverture de la fenetre
                            ecran = SDL_SetVideoMode(T_FENETRE, T_FENETRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);

                    if(!ecran)
                    {
                            printf("erreur SDL: %s\n", SDL_GetError());
                            exit(EXIT_FAILURE);
                    }

                   

                   
                    //chargement des image
                            menu = IMG_Load("images/menu.jpg");
                            emploiJeu = IMG_Load("images/jeu.jpg");
                            emploiEditeur = IMG_Load("images/editeur.jpg");


                    if(!menu || !emploiJeu || !emploiEditeur)
                            printf("impossibles de charger une ou plusieurs images");
                   
                    //on dessine le menu
                                    if(SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255,255,255)) == -1)
                                            printf("erreur: %s", SDL_GetError());
                                    if(SDL_BlitSurface(menu, NULL, ecran, NULL) == -1)
                                            printf("erreur: %s", SDL_GetError());

                    //flip
                            SDL_Flip(ecran);

                    //boucle principale
                            while(continuer)//tant que l'utilisateur veutencore jouer
                            {
                                   
                                    SDL_WaitEvent(&event);//on attend un evenement

                                   

                                            switch(event.type)//on test l'evenement
                                    {
                                            case SDL_QUIT://l'utilisateur demande a fermer le programme
                                                    continuer = 0;
                                                    break;

                                            case SDL_KEYDOWN://on appuie sur une touche du clavier
                                                    switch(event.key.keysym.sym)//on verifie si
                                                    {

                                                    case SDLK_ESCAPE://il s'agit de la touche escap
                                                            continuer = 0;
                                                            break;

                                                    case SDLK_KP1://il s'agit de la touche 1
                                                            //afichage du mode d'emploi
                                                            SDL_BlitSurface(emploiJeu, NULL, ecran, NULL);
                                                            SDL_Flip(ecran);
                                                            SDL_Delay(2000);
                                                            //la fonction jouer
                                                            jouer(ecran, &stage, &continuer);
                                                            break;

                                                    case SDLK_KP2://il s'agit de la touche 2
                                                            SDL_BlitSurface(emploiEditeur, NULL, ecran, NULL);
                                                            SDL_Flip(ecran);
                                                            SDL_Delay(2000);
                                                            //la fonction editeur
                                                            editer(ecran, &stage, &continuer);
                                                            break;
                                                    }
                                                    break;
                                    }
                                            //on dessine le menu
                                    if(SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255,255,255)) == -1)
                                            printf("erreur: %s", SDL_GetError());
                                    if(SDL_BlitSurface(menu, NULL, ecran, NULL) == -1)
                                            printf("erreur: %s", SDL_GetError());
                                    //flip
                                            SDL_Flip(ecran);
                            }

                    //liberer la memoire
                            SDL_FreeSurface(menu);
                            SDL_FreeSurface(emploiEditeur);
                            SDL_FreeSurface(emploiJeu);

                    //quitter la sdl
                            SDL_Quit();

                   
                    return EXIT_SUCCESS;

                   
            }

             



            //jeu.c


            /*fichier qui contient
            les fonctions du jeu
            lui meme*/


            #include "jeu.h"

            void jouer(SDL_Surface *ecran, int *stage, int *continuer)
            {
                    //declaration des variables
                    SDL_Surface *mario[4] = {NULL}; // 4 surfaces pour chacune des directions de mario
                    SDL_Surface *mur = NULL, *caisse = NULL, *caisseOK = NULL, *objectif = NULL, *marioActuel = NULL, *bravo = NULL;
                    SDL_Rect position, positionJoueur;
                    SDL_Event event;
                   
                    int  objectifsRestants = 0, i = 0, j = 0, encore = 1;
                    int carte[NB_BLOCS][NB_BLOCS] = {0};

                   
                    // Chargement des sprites (décors, personnage...)
                    mur = IMG_Load("images/mur.jpg");
                    caisse = IMG_Load("images/caisse.jpg");
                    caisseOK = IMG_Load("images/caisse_ok.jpg");
                    objectif = IMG_Load("images/objectif.png");
                    mario[BAS] = IMG_Load("images/mario_bas.gif");
                    mario[GAUCHE] = IMG_Load("images/mario_gauche.gif");
                    mario[HAUT] = IMG_Load("images/mario_haut.gif");
                    mario[DROITE] = IMG_Load("images/mario_droite.gif");
                    bravo = IMG_Load("images/bravo.jpg");
                    marioActuel = mario[BAS];


                    //test du chargement
                    if(!mur || !caisse || !caisseOK || !objectif || !mario[BAS] || !mario[GAUCHE] || !mario[HAUT] || !mario[DROITE] || !bravo)
                            printf("impossible de charger le decor\n");

                    //chargement du niveau
                    if(chargerNiveau(carte, *stage) == -1)
                    {
                            printf("impossible charger le niveau");
                            exit(EXIT_FAILURE);
                    }

                    //rechercher la position de mario
                    for(i = 0; i < NB_BLOCS; i ++)
                    {
                            for(j = 0; j < NB_BLOCS; j ++)
                            {
                                    if(carte[i][j] == MARIO)
                                    {
                                            positionJoueur.x = i;
                                            positionJoueur.y = j;
                                            carte[i][j] = VIDE;
                                    }
                            }
                    }

                   
                   
                    //activation de la repetition des touches
                    SDL_EnableKeyRepeat(100, 100);

                    //boucle principal
                   
                    while(*continuer && encore)
                    {
                           
                            objectifsRestants = 0;
                            SDL_WaitEvent(&event);
                           

                            switch(event.type)
                            {
                            case SDL_QUIT://on veut sorir du jeu
                                    *continuer = 0;
                                    break;

                            case SDL_KEYDOWN://deplacement de mario
                                    switch(event.key.keysym.sym)
                                    {
                                    case SDLK_UP:
                                            marioActuel = mario[HAUT];
                                            //mettre a jour la position de mario
                                            deplacerMario(carte, &positionJoueur, HAUT);
                                           
                                            break;

                                    case SDLK_DOWN:
                                            marioActuel = mario[BAS];
                                            deplacerMario(carte, &positionJoueur, BAS);
                                            break;

                                    case SDLK_RIGHT:
                                            marioActuel = mario[DROITE];           
                                            deplacerMario(carte, &positionJoueur, DROITE);
                                            break;

                                    case SDLK_LEFT:
                                            marioActuel = mario[GAUCHE];
                                            deplacerMario(carte, &positionJoueur, GAUCHE);
                                            break;

                                    case SDLK_ESCAPE:
                                            encore = 0;
                                            break;
                                   
                                    case SDLK_PAGEUP:
                                            if(*stage < MAXIMUM)
                                            {
                                            (*stage) ++;
                                           
                                            }
                                   
                                           
                                            //chargement du niveau
                                            if(chargerNiveau(carte, *stage) == -1)
                                            {
                                                    printf("impossible charger le niveau");
                                                    exit(EXIT_FAILURE);
                                            }

                                            //rechercher la position de mario
                                            for(i = 0; i < NB_BLOCS; i ++)
                                            {
                                                    for(j = 0; j < NB_BLOCS; j ++)
                                                    {
                                                            if(carte[i][j] == MARIO)
                                                            {
                                                                    positionJoueur.x = i;
                                                                    positionJoueur.y = j;
                                                                    carte[i][j] = VIDE;
                                                            }
                                                    }
                                            }
                                            break;

                                    case SDLK_PAGEDOWN:
                                            if(*stage > 0)
                                            (*stage) --;

                                            //chargement du niveau
                                            if(chargerNiveau(carte, *stage) == -1)
                                            {
                                                    printf("impossible charger le niveau");
                                                    exit(EXIT_FAILURE);
                                            }

                                            //rechercher la position de mario
                                            for(i = 0; i < NB_BLOCS; i ++)
                                            {
                                                    for(j = 0; j < NB_BLOCS; j ++)
                                                    {
                                                            if(carte[i][j] == MARIO)
                                                            {
                                                                    positionJoueur.x = i;
                                                                    positionJoueur.y = j;
                                                                    carte[i][j] = VIDE;
                                                            }
                                                    }
                                            }
                                            break;

                                            case SDLK_r://redemmarer le niveau
                                            //chargement du niveau
                                            if(chargerNiveau(carte, *stage) == -1)
                                            {
                                                    printf("impossible de recharger le niveau");
                                                    exit(EXIT_FAILURE);
                                            }

                                            //rechercher la position de mario
                                            for(i = 0; i < NB_BLOCS; i ++)
                                            {
                                                    for(j = 0; j < NB_BLOCS; j ++)
                                                    {
                                                            if(carte[i][j] == MARIO)
                                                            {
                                                                    positionJoueur.x = i;
                                                                    positionJoueur.y = j;
                                                                    carte[i][j] = VIDE;
                                                            }
                                                    }
                                            }
                                            break;

                                   
                                           
                                    }
                                    break;
                            }
                           
                            //dessiner le contexte


                            //1-remplissage de l'ecran
                                    if(SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255,255,255)) == -1)
                                            printf("erreur: %s", SDL_GetError);


                            //2-dessin de la carte
                    for(i = 0; i < NB_BLOCS; i ++)
                    {
                            for(j = 0; j < NB_BLOCS; j ++)
                            {
                                   
                                    position.x = i * T_BLOC;
                                    position.y = j * T_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;
                                           
                                    }
                            }
                    }
                   

                    //3-dessiner mario
                    position.x = positionJoueur.x * T_BLOC;
                    position.y = positionJoueur.y * T_BLOC;

                   

                    SDL_BlitSurface(marioActuel, NULL, ecran, &position);
                    //flip
                    SDL_Flip(ecran);

                    // Si on n'a trouvé aucun objectif sur la carte, c'est qu'on a gagné, on affiche le message bravo pendant 1s
                    if (!objectifsRestants)
                            {
                                    position.x = (ecran->w - bravo->w)/2;
                                    position.y = (ecran->h - bravo->h)/2;
                                    encore = 0;
                                    SDL_BlitSurface(bravo , NULL, ecran, &position);
                                    SDL_Flip(ecran);
                                    SDL_Delay(1000);
                                    (*stage) ++;
                                    jouer(ecran, stage, continuer);
                                   

                            }

            //flip
                    SDL_Flip(ecran);
            }






                   


                    //dechargement
                    // Désactivation de la répétition des touches (remise à 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]);



            }


            void deplacerMario(int carte[][NB_BLOCS], SDL_Rect *posJoueur, int direction)
            {
                    switch(direction)//selon les direction on met a jour la position de mario
                    {
                    case HAUT:
                            //gestion des collisions
                            if((posJoueur->y-1) < 0)//si on atteint la limite
                                    break;
                            if(carte[posJoueur->x][posJoueur->y - 1] == MUR)//s'il y a un mur
                                    break;
                            //s'il y a une caisse et l'autree case n'est pas vide
                            if((carte[posJoueur->x][posJoueur->y - 1] == CAISSE || carte[posJoueur->x][posJoueur->y - 1] == CAISSE_OK)
                                    && (carte[posJoueur->x][posJoueur->y - 2] == MUR || carte[posJoueur->x][posJoueur->y - 2] == CAISSE
                                    || carte[posJoueur->x][posJoueur->y - 2] == CAISSE_OK || (posJoueur->y + 2) < 0))
                                    break;
                           
                            deplacerCaisse(&carte[posJoueur->x][posJoueur->y - 1], &carte[posJoueur->x][posJoueur->y - 2]);
                            posJoueur->y --;//deplacer mario
                            break;

                    case BAS:
                            if((posJoueur->y+1) == NB_BLOCS)
                                    break;
                            if(carte[posJoueur->x][posJoueur->y + 1] == MUR)
                                    break;
                            if((carte[posJoueur->x][posJoueur->y + 1] == CAISSE || carte[posJoueur->x][posJoueur->y + 1] == CAISSE_OK)
                                    && (carte[posJoueur->x][posJoueur->y + 2] == MUR  || carte[posJoueur->x][posJoueur->y + 2] == CAISSE
                                    || carte[posJoueur->x][posJoueur->y + 2] == CAISSE_OK || (posJoueur->y + 2) == NB_BLOCS))
                                    break;

                            deplacerCaisse(&carte[posJoueur->x][posJoueur->y + 1], &carte[posJoueur->x][posJoueur->y + 2]);
                            posJoueur->y ++;
                            break;

                    case GAUCHE:
                            if((posJoueur->x-1) < 0)
                                    break;
                            if(carte[posJoueur->x - 1][posJoueur->y] == MUR)
                                    break;
                            if((carte[posJoueur->x - 1][posJoueur->y] == CAISSE || carte[posJoueur->x - 1][posJoueur->y ] == CAISSE_OK)
                                    && (carte[posJoueur->x - 2][posJoueur->y] == MUR || carte[posJoueur->x - 2][posJoueur->y] == CAISSE
                                    || carte[posJoueur->x - 2][posJoueur->y] == CAISSE_OK || (posJoueur->x - 2)< 0))
                                    break;

                            deplacerCaisse(&carte[posJoueur->x - 1][posJoueur->y], &carte[posJoueur->x - 2][posJoueur->y]);
                            posJoueur->x --;
                            break;

                    case DROITE:
                            if((posJoueur->x+1) == NB_BLOCS)
                                    break;
                            if(carte[posJoueur->x + 1][posJoueur->y] == MUR)
                                    break;
                            if((carte[posJoueur->x + 1][posJoueur->y] == CAISSE || carte[posJoueur->x + 1][posJoueur->y ] == CAISSE_OK)
                                    && (carte[posJoueur->x + 2][posJoueur->y] == MUR || carte[posJoueur->x + 2][posJoueur->y] == CAISSE
                                    || carte[posJoueur->x + 2][posJoueur->y] == CAISSE_OK || (posJoueur->x + 2) == NB_BLOCS))
                                    break;

                            deplacerCaisse(&carte[posJoueur->x + 1][posJoueur->y], &carte[posJoueur->x + 2][posJoueur->y]);
                            posJoueur->x ++;
                            break;
                    }
            }


            void deplacerCaisse(int *premiere, int *deuxieme)
            {
                    if(*premiere == CAISSE || *premiere == CAISSE_OK)
                    {
                            *premiere = (*premiere == CAISSE_OK) ? OBJECTIF : VIDE;

                   

                            *deuxieme = (*deuxieme == OBJECTIF) ? CAISSE_OK : CAISSE;
                           
                    }

            }



                           
             



            //fichier.c
            /*fichier qui
            gere l'ouverture et l'ecriture
            dans les fichier, et la sauvegarde*/


            #include <stdio.h>
            #include <stdlib.h>
            #include "constantes.h"
            #include "fichier.h"

            int chargerNiveau(int niveau[][NB_BLOCS], int stage)
            {
                    FILE* fichier = NULL;//le fichier .lvl
                    char ligne[(NB_BLOCS * NB_BLOCS) + 1] = {0};
                    long i = 0, j = 0;
                   

                    //ouverture du fichier
                    fichier = fopen("niveau.lvl", "r");
                    if(fichier == NULL)
                    {
                            printf("erreur d'ouverture du fichier\n");
                            return -1;
                    }
                     rewind(fichier);

                    //lecture du fichier
                    for(i = 0; i < stage; i ++)
                    fseek(fichier,  ((NB_BLOCS * NB_BLOCS)+2), SEEK_CUR);

                   
                   
                    fgets(ligne, ((NB_BLOCS * NB_BLOCS)+1), fichier);

                    //convertir  les caracteres en nombres dans le tableau carte
                    for(i = 0; i < NB_BLOCS; i ++)
                    {
                            for(j = 0; j < NB_BLOCS; j ++)
                            {
                                    switch(ligne[(i * NB_BLOCS) + j])
                                    {
                                            case '0':
                                                     niveau[j][i] = 0;
                                 break;
                            case '1':
                                niveau[j][i] = 1;
                                break;
                            case '2':
                                niveau[j][i] = 2;
                                break;
                            case '3':
                                niveau[j][i] = 3;
                                break;
                            case '4':
                                niveau[j][i] = 4;
                                break;


                                            case '5':
                                niveau[j][i] = 5;
                                break;
                                                   
                                                   


                                           
                        }
                                   
                    }
                    }

                    fclose(fichier);

                    return 0;

            }





            int sauvegarder(int carte[][NB_BLOCS][NB_BLOCS])
            {
                    long i = 0, j = 0, z =0;
                    char ligne = 0;
                    FILE* fichier = NULL;
                    fichier = fopen("niveau.lvl", "w");
                    if(fichier == NULL)
                    {
                            return -1;
                    }
            for(z = 0; z < MAXIMUM; z++)
                    {
                    for(i = 0; i < NB_BLOCS; i++)
                    {
                            for(j = 0; j < NB_BLOCS; j ++)
                            {
                                   
                                    fprintf(fichier , "%ld", carte[z][j][i]);
                            }
                    }
                    fprintf(fichier, "\n");
            }

                    fclose(fichier);

                    return 0;
            }

            int chargerMonNiveau(int niveau[][NB_BLOCS][NB_BLOCS])
            {
                    FILE* fichier = NULL;//le fichier .lvl
                    char ligne[(NB_BLOCS * NB_BLOCS) + 2] = {0};
                    long i = 0, j = 0, z = 0;
                   

                    //ouverture du fichier
                    fichier = fopen("niveau.lvl", "r");
                    if(fichier == NULL)
                    {
                            printf("erreur d'ouverture du fichier\n");
                            return -1;
                    }
                     rewind(fichier);

                   
                   


                    //convertir  les caracteres en nombres dans le tableau carte


            for(z = 0; z < (MAXIMUM + 1); z ++)
            {
                   
                                    fgets(ligne,( NB_BLOCS * NB_BLOCS) + 2, fichier);
                    

                    for(i = 0; i < NB_BLOCS; i ++)
                    {
                            for(j = 0; j < NB_BLOCS; j ++)
                            {
                                   
                                   
                                    
                                    switch(ligne[(i*NB_BLOCS)+ j])
                                    {
                                            case '0':
                                                     niveau[z][j][i] = 0;
                                 break;
                            case '1':
                                 niveau[z][j][i]= 1;
                                break;
                            case '2':
                                niveau[z][j][i] = 2;
                                break;
                            case '3':
                                 niveau[z][j][i] = 3;
                                break;
                            case '4':
                                 niveau[z][j][i] = 4;
                                break;
                                            case '5':
                                niveau[z][j][i] = 5;
                                                   
                                break;

                                           
                        }
                                   
                                   
                                   
                    }
                           
                    }
                   
            }



                    fclose(fichier);

                    return 0;

            }

             



            //editeur.c

            #include "editeur.h"



            void editer(SDL_Surface *ecran, int *stage, int *continuer)
            {
                   
                    //declaration des variables
                   
                    SDL_Surface *mur = NULL, *caisse = NULL, *caisseOK = NULL, *objectif = NULL, *objet = NULL, *mario= NULL, *cur = NULL;
                    SDL_Rect position, posCur;
                    SDL_Event event;
                   
                    int  i = 0, j = 0, depart = 0, encore = 1;
                    int carte[MAXIMUM+1][NB_BLOCS][NB_BLOCS] = {0}, clicGauche = 0, clicDroit = 0;

                   


                   
                    // Chargement des sprites (décors, personnage...)
                    mur = IMG_Load("images/mur.jpg");
                    caisse = IMG_Load("images/caisse.jpg");
                    caisseOK = IMG_Load("images/caisse_ok.jpg");
                    objectif = IMG_Load("images/objectif.png");
                    mario = IMG_Load("images/mario_bas.gif");
                    objet = MUR;
                    cur = mur;


                    //test du chargement
                    if(!mur || !caisse || !caisseOK || !objectif   || !mario || !objet)
                            printf("impossible de charger le decor\n");

                   
                                            //chargement du niveau
                                            if(chargerMonNiveau(carte) == -1)
                                            {
                                                    printf("impossible charger le niveau");
                                                    exit(EXIT_FAILURE);
                                            }

                                    //activation de repetition de touche
                                            SDL_EnableKeyRepeat(100, 100);

                    while(*continuer && encore)
                    {
                            SDL_WaitEvent(&event);

                            //dessiner le contexte


                            //1-remplissage de l'ecran
                                    if(SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255,255,255)) == -1)
                                            printf("erreur: %s", SDL_GetError);


                            //2-dessin de la carte
                    for(i = 0; i < NB_BLOCS; i ++)
                    {
                            for(j = 0; j < NB_BLOCS; j ++)
                            {
                                    position.x = i * T_BLOC;
                                    position.y = j * T_BLOC;

                                    switch(carte[*stage][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);
                                                    break;

                                            case MARIO:
                                                    SDL_BlitSurface(mario, NULL, ecran, &position);
                                                    break;


                                    }
                            }
                    }

                            switch(event.type)
                            {
                            case SDL_QUIT:
                                    *continuer = 0;
                                    break;

                            case SDL_MOUSEBUTTONDOWN://le clic de la souris
                                    switch(event.button.button)
                                    {
                                            case SDL_BUTTON_LEFT:
                                                    if(objet == MARIO)
                                                            depart = 1;
                                                    if(depart == 0)
                                                    {
                                                            carte[(*stage)][event.button.x / T_BLOC][event.button.y / T_BLOC] = objet;
                                                            clicGauche = 1;
                                                    }
                                                    break;

                                            case SDL_BUTTON_RIGHT:
                                                    carte[(*stage)][event.button.x / T_BLOC][event.button.y / T_BLOC] = VIDE;
                                                    clicDroit = 1;
                                                    break;

                                           

                                    }
                                    break;

                            case SDL_MOUSEBUTTONUP://lever le clic
                                    clicGauche = 0;
                                    clicDroit = 0;
                                    break;

                            case SDL_MOUSEMOTION://deplacer la souris
                           
                                    if(clicGauche)     
                                            carte[(*stage)][event.motion.x / T_BLOC][event.motion.y / T_BLOC] = objet;
                                    else if(clicDroit)
                                            carte[(*stage)][event.motion.x / T_BLOC][event.motion.y / T_BLOC] = VIDE;       

                                    //le curseur
                                    posCur.x = event.motion.x;
                                    posCur.y = event.motion.y;
                                    SDL_BlitSurface(cur, NULL, ecran, &posCur);

                                    break;

                            case SDL_KEYDOWN://boutton du clavier
                            switch(event.key.keysym.sym)
                            {
                                    case SDLK_KP1:
                                            objet = MUR;
                                            cur = mur;
                                            break;

                                    case SDLK_KP2:
                                            objet = CAISSE;
                                            cur = caisse;
                                            break;

                                    case SDLK_KP3:
                                            objet = CAISSE_OK;
                                            cur = caisseOK;
                                            break;

                                    case SDLK_KP4:
                                           
                                            objet = MARIO;
                                            cur = mario;
                                            break;

                                    case SDLK_KP5:
                                            objet = OBJECTIF;
                                            cur = objectif;
                                            break;

                                    case SDLK_s://on veut sauvegarder
                                            if(sauvegarder(carte) == -1)
                                                    printf("impossible de sauvegarder le niveau");
                                            break;

                                    case SDLK_PAGEUP:
                                            if(*stage < MAXIMUM)
                                            (*stage) ++;
                                           
                                            //chargement du niveau
                                            if(chargerMonNiveau(carte) == -1)
                                            {
                                                    printf("impossible de charger le niveau");
                                                    exit(EXIT_FAILURE);
                                            }

                                           
                                            break;

                                    case SDLK_PAGEDOWN:
                                            if(*stage > 0)
                                            (*stage) --;

                                           
                                            //chargement du niveau
                                            if(chargerMonNiveau(carte) == -1)
                                            {
                                                    printf("impossible de charger le niveau");
                                                    exit(EXIT_FAILURE);
                                            }

                                           
                                            break;
                                    case SDLK_r:
                                            //chargement du niveau
                                            if(chargerMonNiveau(carte) == -1)
                                            {
                                                    printf("impossible de recharger le niveau");
                                                    exit(EXIT_FAILURE);
                                            }
                                            break;

                                    case SDLK_ESCAPE:
                                            encore = 0;
                                            break;





                            }
                            break;

                            }

                           
                            SDL_Flip(ecran);
                    }
            // Libération des surfaces chargées
                    SDL_EnableKeyRepeat(0, 0);
                    SDL_FreeSurface(mur);
                    SDL_FreeSurface(caisse);
                    SDL_FreeSurface(caisseOK);
                    SDL_FreeSurface(objectif);
                    SDL_FreeSurface(mario);
            }


             



            et pour les headers je ne suis pas sur que vous en aurez besoin
            • Partager sur Facebook
            • Partager sur Twitter
              2 août 2007 à 22:18:26

              http://www.siteduzero.com/forum-83-169591-1553758.html#r1553758

              Si t'écoutes pas les conseils qu'on te donne je peux plus rien pour toi...
              • Partager sur Facebook
              • Partager sur Twitter
                2 août 2007 à 22:36:35

                je ne comprends pas ce que tu veux dire, et en plus le lien sert a quoi??
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  2 août 2007 à 22:39:12

                  Rajoute ce makefile pour qu'on puisse compiler ton truc facilement :
                  FILES = editeur.c fichier.c jeu.c main.c

                  sokoban : $(FILES)
                  gcc -o sokoban $(FILES) -lSDL -lSDL_image

                  Bouh, pas de coloration pour les makefiles :p
                  Honteux !

                  Tu pourrais donner un fichier de niveau s'il te plaît ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 août 2007 à 22:44:22

                    Citation : marox

                    je ne comprends pas ce que tu veux dire


                    Si tu me dis pas ce que tu comprend pas je vais pas le deviner...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 août 2007 à 22:51:36

                      Citation : Caribou87

                      Si tu me dis pas ce que tu comprend pas je vais pas le deviner...


                      je ne comprends pas de quels conseils tu as parlé.

                      Citation : Kreeg

                      Rajoute ce makefile pour qu'on puisse compiler ton truc facilement :

                      FILES = editeur.c fichier.c jeu.c main.c

                      sokoban : $(FILES)
                      gcc -o sokoban $(FILES) -lSDL -lSDL_image


                      Bouh, pas de coloration pour les makefiles :p
                      Honteux !


                      je ne sais pas comment faire, stp plus de precisions..

                      voila le fichier niveaux.lvl:
                      111111111111111111111111111111111111111111111111111111111111114200000311111111111111111111111111111111111111111111111111111111111111111111111111
                      111111111111111111111111111111111111111400001111111111221111111111001111111111001111111111031111111111011111111111011111111111311111111111111111
                      111111111111111111111111111111111111111111001111114200001111111111101111111111101111111001100111111000000111111011111111111311111111111111111111
                      111110011111111114000001111100011001033101011011000002001211100101000011111100011211111111111001111130000001111111111111111111111111111111111111
                      111111111111111111111111111111111111110011111111100000011111103312011111111002011111111114011111111111111111111111111111111111111111111111111111
                      111111111111111111111111111111111111111100311111111021311111111000011111111101001111111120401111111100011111111111111111111111111111111111111111
                      111111111111111111111111111111111111111111031111111111001111111102200111111100000111111112101111111113431111111111111111111111111111111111111111
                      111111111111111111111111111111111111111333341111110020120111110020020111110011000111111111111111111111111111111111111111111111111111111111111111
                      111111111111111114001111111302031111111002011111111101111111110200111111100000111111130011111111111111111111111111111111111111111111111111111111
                      111111111111111111111111111111001111110003321111110241020111111233000111111001100111111111111111111111111111111111111111111111111111111111111111
                      111111111111111111111111111111111111110011111111110300311111110301011111110020011111111221111111111041111111111111111111111111111111111111111111
                      111111111111111111111111111111111111111110011111111110011111111002220111111033310111111013330111111022241111111110001111111111111111111111111111
                      111111111111111111111111111111111111111111111111111111031111111111033011111100200311111100010111111112220111111110411111111111111111111111111111
                      111111111111111111111111111100111111111102011111111032311111111023201111111032301111111114111111111100111111111100111111111100111111111111111111
                      111111111111111111111111111111111111111000111111103232400111100232300111111010111111111000111111111111111111111111111111111111111111111111111111
                      111111111111111111111111111111111111111100111111111130111111111030111111111232111111114232001111110230001111111100111111111111111111111111111111
                      111111111111111111111111111111111111111110001111111110521111111105450011111103500011111110001111111110011111111111111111111111111111111111111111
                      100002000111100000000111110000011111200004300002111020501111111000301111111000001111111020001111111100311111111110111111111112111111111110111111
                      111111111111111111111111111110011111110002001111110055501111110030301111111050500111111155500111111102011111111104011111111111111111111111111111

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        2 août 2007 à 22:54:06

                        Tu créé un fichier nommé Makefile où tu écris ce que je t'ai donné, et tu le places dans le dossier des sources.

                        >> erreur d'ouverture du fichier

                        Pourquoi ton dossier s'appelle rz0 ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          2 août 2007 à 22:58:17

                          ah j'ai oublié, le fichier dois se nommer niveau.lvl sans le 'x'

                          je ne sais pas de quel dossier tu parle
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            2 août 2007 à 23:01:13

                            Pour le makefile, c'est bon ?

                            T'as ajouté quoi au truc là ? Au risque de te décevoir, je dirais que là, je n'ai vu que la version M@teo21, qu'est-ce qui change de l'original ?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              2 août 2007 à 23:03:22

                              oui c'est bon.
                              as tu essayé le jeu.
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                2 août 2007 à 23:04:46

                                Ouais, j'l'ai compilé, et je t'ai écrit ce makefile.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  2 août 2007 à 23:07:14

                                  merci, je vais oser de te demander un service(tu es motivé, merci)
                                  pls essaie de me trouver un lien direct pour ce projet(et ajoutes y le makefile), car ce rapidshare(ou j'ai upload' ce fichier) ressemble a de la m****
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    4 août 2007 à 1:43:22

                                    UP, pour avoir d'autres suggestions pls
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Anonyme
                                      4 août 2007 à 12:19:10

                                      Euh, pourquoi ne pas le mettre sur ton FTP free ?
                                      Si tu le veux, donne moi la nouvelle archive, et je le met sur le mien ^^
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        4 août 2007 à 13:21:45

                                        l'archive est dans le premier message.
                                        pls ajoutes y le makefile, puis mets la sur ton ftp, je te serais reconnaissant.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Anonyme
                                          4 août 2007 à 14:21:01

                                          Ok, j'edite plus tard pour le lien.
                                          http://mario_sokoban.fr.nf/ --> voilà !

                                          (L'exécutable qu'il y a est un exécutable Linux)
                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          [C/SDL]mario sokoban amelioré

                                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                          • Editeur
                                          • Markdown