Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème mario sokoban

Impossible de lancer une partie

Sujet résolu
    6 juillet 2018 à 16:10:18

    Bonjours tout le monde,

    Je suis actuellement débutant dans le domaine du codage  et je me planche sur le TP Mario sokoban (je suis en SDL2)  et voila plusieurs jours que je bloque au moment de lancer ma partie.

    Je peut lancer mon éditeur de map et sauvegarder sans le moindre soucis mais quand je lance ma partie je reste sur le menu, puis le jeux crash si j'utilise une input, la compilation manuelle et via CodeBlocks ne me retourne aucun warning ou erreur.  Je n'arrive pas a trouver ce qu'il ne va pas pourtant mon code est quasiment identique a celui du cours.

    Dans l'espoir que quelqu'un puisse m'éclairer ou m'orienter sur mon problème !

     jeu.c

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL.h>
    
    #include "SDL_image.h"
    #include "constantes.h"
    #include "jeu.h"
    #include "editeur.h"
    #include "fichier.h"
    
    void jouer(SDL_Window *pWindow)
    {
        SDL_bool partieLancer = SDL_TRUE;
    
        int objectifsRestants = 0, i = 0, j = 0;
        int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};
        SDL_Surface *directionMario[4] = {NULL}; // 4 surfaces pour 4 directions de mario
        SDL_Surface *mur = NULL, *caisse = NULL, *caisseOK = NULL, *objectif = NULL, *marioActuel = NULL;
        SDL_Surface *ecran = NULL;
        SDL_Rect position, positionJoueur;
    
        SDL_Event event;
    
        ecran = SDL_GetWindowSurface(pWindow);
    
        directionMario[HAUT] = IMG_Load("src/marioHAUT.gif");
        directionMario[BAS] = IMG_Load("src/marioBAS.gif");
        directionMario[GAUCHE] = IMG_Load("src/marioGAUCHE.gif");
        directionMario[DROITE] = IMG_Load("src/marioDROITE.gif");
    
        caisse = IMG_Load("src/caisse.jpg");
        mur = IMG_Load("src/mur.jpg");
        caisseOK = IMG_Load("src/caisseSurObjectif.jpg");
        objectif = IMG_Load("src/objectif.png");
        marioActuel = directionMario[BAS];
    
    
    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 sur la carte
                {
                    positionJoueur.x = i;
                    positionJoueur.y = j;
                    carte[i][j] = VIDE;
                }
            }
        }
    
    
        while (partieLancer)
        {
            SDL_WaitEvent(&event);
    		switch(event.type)
    		{
        		case SDL_QUIT:
            		partieLancer = SDL_FALSE;
            		break;
        		case SDL_KEYDOWN:
            		switch(event.key.keysym.sym)
            		{
    
                		case SDLK_UP:
                   			marioActuel = directionMario[HAUT];
                    		deplacerJoueur(carte, &positionJoueur, HAUT);
                    		break;
                		case SDLK_DOWN:
                    		marioActuel = directionMario[BAS];
                    		deplacerJoueur(carte, &positionJoueur, BAS);
                    		break;
                		case SDLK_RIGHT:
                    		marioActuel = directionMario[DROITE];
                   		 	deplacerJoueur(carte, &positionJoueur, DROITE);
                    		break;
                		case SDLK_LEFT:
                    		marioActuel = directionMario[GAUCHE];
                    		deplacerJoueur(carte, &positionJoueur, GAUCHE);
                    		break;
    
                        case SDLK_ESCAPE:
                            partieLancer = SDL_FALSE;
                            break;
    
            		}
                    default:
                        continue;
    		}
    
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
    
            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)
            {
                printf("partie gagner \n");
                partieLancer = SDL_FALSE;
            }
    
    
            // 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_UpdateWindowSurface(pWindow);
        }
    
    
    
        SDL_FreeSurface(mur);
        SDL_FreeSurface(caisse);
        SDL_FreeSurface(caisseOK);
        SDL_FreeSurface(objectif);
        for (i = 0 ; i < 4 ; i++)
            SDL_FreeSurface(directionMario[i]);
        SDL_FreeSurface(ecran);
    }
    
    void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction)
    {
    
        switch(direction)
        {
            case HAUT:
            {
    
    
                if(pos->y - 1 < 0)
                    break;
                if (carte[pos->x][pos->y - 1] == MUR)
                    break;
                // Si on veut pousser une caisse, il faut vérifier qu'il n'y a pas de mur derrière (ou une autre caisse, ou la limite du monde)
                if((carte[pos->x][pos->y - 1] == CAISSE || carte[pos->x][pos->y - 1] == CAISSE_OK) && (pos->y - 2 < 0 ||
                    carte[pos->x][pos->y - 2] == MUR || carte[pos->x][pos->y - 2] == CAISSE || carte[pos->x][pos->y - 2] == CAISSE_OK))
                    break;
    
    
                deplacerCaisse(&carte[pos->x][pos->y - 1], &carte[pos->x][pos->y - 2]);
                pos->y--;
                break;
            }
    
            case BAS:
            {
    
    
                if(pos->y + 1 < HAUTEUR_FENETRE)
                    break;
                if (carte[pos->x][pos->y + 1] == MUR)
                    break;
                // Si on veut pousser une caisse, il faut vérifier qu'il n'y a pas de mur derrière (ou une autre caisse, ou la limite du monde)
                if((carte[pos->x][pos->y + 1] == CAISSE || carte[pos->x][pos->y + 1] == CAISSE_OK) && (pos->y + 2 < HAUTEUR_FENETRE ||
                    carte[pos->x][pos->y + 2] == MUR ||carte[pos->x][pos->y + 2] == CAISSE || carte[pos->x][pos->y + 2] == CAISSE_OK))
                    break;
    
    
                deplacerCaisse(&carte[pos->x][pos->y + 1], &carte[pos->x][pos->y + 2]);
                pos->y--;
                break;
            }
    
            case GAUCHE:
            {
    
    
                if(pos->x - 1 < 0)
                    break;
                if (carte[pos->x - 1][pos->y] == MUR)
                    break;
                // Si on veut pousser une caisse, il faut vérifier qu'il n'y a pas de mur derrière (ou une autre caisse, ou la limite du monde)
                if((carte[pos->x - 1][pos->y] == CAISSE || carte[pos->x - 1][pos->y] == CAISSE_OK) && (pos->x - 2 < 0 ||
                    carte[pos->x - 2][pos->y] == MUR ||carte[pos->x - 2][pos->y] == CAISSE || carte[pos->x - 2][pos->y] == CAISSE_OK))
                    break;
    
                deplacerCaisse(&carte[pos->x - 1][pos->y], &carte[pos->x - 2][pos->y]);
                pos->x--;
                break;
            }
    
            case DROITE:
            {
    
    
                if(pos->x + 1 < LARGEUR_FENETRE)
                    break;
                if (carte[pos->x + 1][pos->y] == MUR) // S'il y a un mur, on arrête
                    break;
                // Si on veut pousser une caisse, il faut vérifier qu'il n'y a pas de mur derrière (ou une autre caisse, ou la limite du monde)
                if((carte[pos->x + 1][pos->y] == CAISSE || carte[pos->x + 1][pos->y] == CAISSE_OK) && (pos->x + 2 < LARGEUR_FENETRE ||
                    carte[pos->x + 2][pos->y] == MUR ||carte[pos->x + 2][pos->y] == CAISSE || carte[pos->x + 2][pos->y] == CAISSE_OK))
                    break;
    
    
                deplacerCaisse(&carte[pos->x + 1][pos->y], &carte[pos->x + 2][pos->y]);
                pos->x++;
                break;
            }
        }
    
    }
    
    void deplacerCaisse(int *premiereCase, int *secondeCase)
    {
        if (*premiereCase == CAISSE || *premiereCase == CAISSE_OK)
        {
    
            if (*secondeCase == OBJECTIF)
                *secondeCase = CAISSE_OK;
            else
                *secondeCase = CAISSE;
    
            if(*premiereCase == CAISSE_OK)
                *premiereCase = OBJECTIF;
            else
               *premiereCase = VIDE;
        }
    }

    fichier.c

    #include <stdlib.h>
    #include <stdio.h>
    
    #include "constantes.h"
    
    
    int chargerNiveau(int niveau[][NB_BLOCS_HAUTEUR])
    {
        FILE *fichier = NULL;
        char ligneFichier[NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1] = {0};
        int i = 0, j = 0;
    
        fichier = fopen("src/niveau.lvl", "r");
        if(fichier  == NULL)
        {
            printf("fichier non charger");
            return 0;
        }
    
        fgets(ligneFichier, NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1, fichier);
        printf("niveau charger \n");
    
    
        for (i = 0; i < NB_BLOCS_LARGEUR; i++)
        {
            for (j = 0; j < NB_BLOCS_HAUTEUR; j++)
            {
                switch (ligneFichier[(i * NB_BLOCS_LARGEUR) + 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;
                }
            }
        }
    
        fclose(fichier);
        return 1;
    }
    
    int sauvegarderNiveau(int niveau[][NB_BLOCS_HAUTEUR])
    {
        FILE* fichier = NULL;
        int i = 0, j = 0;
    
        fichier = fopen("src/niveau.lvl", "w");
        if (fichier == NULL)
            return 0;
    
        for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
        {
            for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
            {
                fprintf(fichier, "%d", niveau[j][i]);
            }
        }
    
        printf("sauvegarde effectué !\n");
    
        fclose(fichier);
        return 1;
    } 

    main.c

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL.h>
    
    #include "SDL_image.h"
    #include "constantes.h"
    #include "jeu.h"
    #include "editeur.h"
    
    
    
    void SDL_ExitWithEroor(const char *message);
    
    
    // compil manuelle = gcc src/*.c -o prog -I include -L lib -lmingw32 -lSDL2main -lSDL2 -lSDL2_image
    
    int main(int argc, char *argv[])
    {
    	SDL_Surface *screenSurface = NULL, *menuSurface = NULL;
    	SDL_Window *window = NULL;
    	SDL_Rect positionMenu;
    	SDL_Event event;
    
    	SDL_bool program_Launched = SDL_TRUE;
    
        IMG_Init(IMG_INIT_JPG | IMG_INIT_PNG);
    	if(SDL_Init(SDL_INIT_VIDEO) != 0)
    		SDL_ExitWithEroor("Echec initialisation VIDEO");
    
    
    	window = SDL_CreateWindow("Mario SOKOBAN",
                                   SDL_WINDOWPOS_CENTERED,
                                   SDL_WINDOWPOS_CENTERED,
                                   LARGEUR_FENETRE, HAUTEUR_FENETRE,
                                   0);
        if(window == NULL)
        {
            SDL_ExitWithEroor("création de fenêtre");
        }
    
        SDL_SetWindowIcon(window, IMG_Load("src/caisse.jpg"));
    
        screenSurface = SDL_GetWindowSurface(window);
    
        menuSurface = IMG_Load("src/menu.jpg");
        positionMenu.x = 0;
        positionMenu.y = 0;
    
    
    
    
    	while(program_Launched)
    	{
    		SDL_WaitEvent(&event);
    
    		switch(event.type)
    		{
    			case SDL_QUIT:
    				program_Launched = SDL_FALSE;
    				break;
    
    			case SDL_KEYDOWN:
    			{
    				switch(event.key.keysym.sym)
    				{
    					case SDLK_ESCAPE:
    						program_Launched = SDL_FALSE;
    						break;
    
                        case SDLK_KP_1: // Demande à jouer
                            SDL_FreeSurface(menuSurface);
                            jouer(window);
                            break;
    
                        case SDLK_KP_2: // Demande l'éditeur de niveaux
                            editeur(window);
                            break;
    
    				}
    			}
    		}
    
    		SDL_BlitSurface(menuSurface, NULL, screenSurface, &positionMenu);
        	SDL_UpdateWindowSurface(window);
    	}
    
    	SDL_FreeSurface(menuSurface);
    	SDL_DestroyWindow(window);
    	SDL_Quit();
    
    	return 0;
    }
    
    void SDL_ExitWithEroor(const char *message)
    {
        SDL_Log("ERREUR : %s > %s\n", message, SDL_GetError());
        exit(EXIT_FAILURE);
    }






    -
    Edité par Tox-67 6 juillet 2018 à 16:12:27

    • Partager sur Facebook
    • Partager sur Twitter
      6 juillet 2018 à 18:03:56

      Salut,

      • Fais plus de fonctions. Des petites fonctions qui font une chose et le font bien, c'est parfait (tes fonctions ne devraient pas faire plus d'une vingtaine de ligne dans l'idéal).
      • Vérifie le retour des fonctions à risques (chargement d'images, initialisation tout ça).
      • Pourquoi tes images sont dans le dossier src ? Dans un dossier rsc (pour « ressources » je voudrais bien, mais src, c'est généralement pour les sources).
      • Utilise la SDL 2 « pour de vrai », utilise des textures et pas des surfaces, un renderer et pas la surface de l'écran.
      • Dans ta fonction de chargement de niveau, ce que tu fais en gros c'est niveau[i][j] = fichier[i * NB_LARGEUR + I] - '0'. Néanmoins, pour quelque chose de mieux et de plus simple, je t'invite à te pencher sur le tutoriel de @Fvirtman sur le tile mapping.
      • Code en français ou en anglais, mais pas les deux.
      • Partager sur Facebook
      • Partager sur Twitter
      Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
        10 juillet 2018 à 11:33:10

        Bonjour,

        Merci pour ta réponse, j'ai bien vérifier les retours de mes fonction rien a signalé de se coter la,

        de base mon idée etait de le faire a la manière SDL1.2 puis de le refaire avec des Texture et un Render (ce que j'ai commencer a faire d'ailleur).

        par contre pour :

        yo@n97one a écrit:

        • Dans ta fonction de chargement de niveau, ce que tu fais en gros c'est niveau[i][j] = fichier[i * NB_LARGEUR + I] - '0'.

        je ne suis pas sur de saisir comment l'utilisé aurait tu un exemple ? Et je suppose que "I" est un compteur ?

        merci d'avance !

        -
        Edité par Tox-67 10 juillet 2018 à 11:36:01

        • Partager sur Facebook
        • Partager sur Twitter
          10 juillet 2018 à 12:01:45

          Faute de frappe, ce n'est pas I mais j. Le truc, c'est que (en tout cas en ASCII) 0 = '0' - '0', 1 = '1' - '0', ..., 9 = '9' - '0', donc plutôt que de faire plusieurs cas (regarder si c'est un '1', un 2, etc.), il te suffit de soustraire '0'.

          Tu as une fuite mémoire ; la surface que tu charges pour ton icône n'est jamais libérée (encore une mauvaise pratique du tutoriel d'OC...). Et aucun de tes chargements d'image n'est vérifié.

          • Partager sur Facebook
          • Partager sur Twitter
          Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
            10 juillet 2018 à 21:39:24

            Re bonjours,

            Merci pour tes retour !

            je viens de finir la version SDL2, mais j'ai toujours se problème de partie qui ne se lance pas (le jeu reste sur le menu) j'ai pourtant un retour positif sur le chargement de la map et encore une fois mon éditeur fonctionne. ps: je sais me reste 2 ou 3 truc a réécrire en anglais.

            Si jamais quelq'un a une idée ou une reponse a mon problème !

            Merci d'avance ! :)

            main.c

            #include <stdlib.h>
            #include <stdio.h>
            #include <SDL.h>
            
            #include "SDL_image.h"
            #include "constantes.h"
            #include "jeu.h"
            #include "editeur.h"
            #include "fichier.h"
            
            
            // compil manuelle = gcc src/*.c -o prog -I include -L lib -lmingw32 -lSDL2main -lSDL2 -lSDL2_image
            
            int main(int argc, char *argv[])
            {
            	SDL_Surface *menuSurface = NULL, *iconSurface = NULL;
            	SDL_Window *window = NULL;
            	SDL_Renderer *render = NULL;
            	SDL_Texture *t_Menu = NULL;
            
            	SDL_Rect position;
            	SDL_Event event;
            
            	SDL_bool program_Launched = SDL_TRUE;
            
            
            	if(SDL_Init(SDL_INIT_VIDEO) != 0)
            		SDL_ExitWithEroor("Echec initialisation VIDEO");
                IMG_Init(IMG_INIT_JPG | IMG_INIT_PNG);
            
                menuSurface = IMG_Load("rsc/menu.jpg");
            
            
            	window = SDL_CreateWindow("Mario SOKOBAN",
                                           SDL_WINDOWPOS_CENTERED,
                                           SDL_WINDOWPOS_CENTERED,
                                           WIDTH_WINDOW, HEIGHT_WINDOW,
                                           0);
                if(window == NULL)
                {
                    SDL_ExitWithEroor("création de fenêtre");
                }
            
                iconSurface = IMG_Load("rsc/caisse.jpg");
                SDL_SetWindowIcon(window, iconSurface);
            
                render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
                SDL_RenderClear(render);
            
                t_Menu = SDL_CreateTextureFromSurface(render, menuSurface);
                if(t_Menu == NULL)
                    printf("Texture non Creer \n");
                SDL_FreeSurface(menuSurface);
            
                if(SDL_QueryTexture(t_Menu, NULL, NULL, &position.w, &position.h) != 0)
                {
                    SDL_DestroyWIndowAndRanderer(window, render);
                	SDL_ExitWithEroor("impossible de creer la texture");
                }
            
            
                position.x = (WIDTH_WINDOW - position.w)/2;
                position.y = (HEIGHT_WINDOW - position.h)/2;
            
            
            
            	while(program_Launched)
            	{
            		SDL_WaitEvent(&event);
            
            		switch(event.type)
            		{
            			case SDL_QUIT:
            				program_Launched = SDL_FALSE;
            				break;
            
            			case SDL_KEYDOWN:
            			{
            				switch(event.key.keysym.sym)
            				{
            					case SDLK_ESCAPE:
            						program_Launched = SDL_FALSE;
            						break;
            
                                case SDLK_KP_1: // Demande à jouer
                                    play(render);
                                    break;
            
                                case SDLK_KP_2: // Demande l'éditeur de niveaux
                                    editing(render);
                                    break;
            				}
            			}
            		}
                    if(SDL_RenderCopy(render, t_Menu, NULL, &position) != 0)
                    {
                        SDL_DestroyWIndowAndRanderer(window, render);
                        SDL_ExitWithEroor("impossible d'afficher la texture");
                    }
            
                    SDL_RenderPresent(render);
            	}
            
                SDL_FreeSurface(iconSurface);
            	SDL_DestroyTexture(t_Menu);
            	SDL_DestroyWIndowAndRanderer(window, render);
            	IMG_Quit();
            	SDL_Quit();
            
            	return 0;
            }
            

            jeu.c

            void play(SDL_Renderer *pRender)
            {
                SDL_bool game_Launch = SDL_TRUE;
            
                int remainObjective = 0, i = 0, j = 0;
                int map[NB_BLOCK_WIDTH][NB_BLOCK_HEIGHT] = {0};
            
                SDL_Texture *t_Mario[4] = {NULL};
                SDL_Texture *t_Mur = NULL, *t_Caisse = NULL, *t_CaisseOK = NULL, *t_Objectif = NULL, *t_MarioActuel = NULL;
                SDL_Rect position = {0, 0, 34, 34}, positionJoueur;
            
                SDL_Event event;
            
            
                t_Mario[HAUT] = IMG_LoadTexture(pRender,"rsc/marioHAUT.gif");
                if(t_Mario[HAUT] == NULL)
                    printf("Texture : Mario[HAUT] non Creer \n");
            
                t_Mario[BAS] = IMG_LoadTexture(pRender,"rsc/marioBAS.gif");
                if(t_Mario[HAUT] == NULL)
                    printf("Texture : Mario[HAUT] non Creer \n");
            
                t_Mario[GAUCHE] = IMG_LoadTexture(pRender,"rsc/marioGAUCHE.gif");
                if(t_Mario[GAUCHE] == NULL)
                    printf("Texture : Mario[GAUCHE] non Creer \n");
            
                t_Mario[DROITE] = IMG_LoadTexture(pRender,"rsc/marioDROITE.gif");
                if(t_Mario[DROITE] == NULL)
                    printf("Texture : Mario[DROITE] non Creer \n");
            
                t_Caisse = IMG_LoadTexture(pRender,"rsc/caisse.jpg");
                if(t_Caisse == NULL)
                    printf("Texture : CAISSE non Creer \n");
            
                t_Mur = IMG_LoadTexture(pRender,"rsc/mur.jpg");
                if(t_Mur == NULL)
                    printf("Texture : MUR non Creer \n");
            
                t_Objectif = IMG_LoadTexture(pRender,"rsc/objectif.png");
                if(t_Objectif == NULL)
                    printf("Texture : MUR non Creer \n");
            
                t_CaisseOK = IMG_LoadTexture(pRender,"rsc/caisseSurObjectif.jpg");
                if(t_CaisseOK == NULL)
                    printf("Texture : CaisseOK non Creer \n");
            
            
                t_MarioActuel = t_Mario[BAS];
            
            
                if (!loadLevel(map))
                    exit(EXIT_FAILURE);
            
            
                for (i = 0; i < NB_BLOCK_WIDTH; i++)
                {
                    for (j = 0; j < NB_BLOCK_HEIGHT; j++)
                    {
                        if (map[i][j] == MARIO)
                        {
                            positionJoueur.x = i;
                            positionJoueur.y = j;
                            map[i][j] = VIDE;
                        }
                    }
                }
            
            
                while (game_Launch)
                {
                    SDL_WaitEvent(&event);
            
            		switch(event.type)
            		{
                		case SDL_QUIT:
                    		game_Launch = SDL_FALSE;
                    		break;
                		case SDL_KEYDOWN:
                    		switch(event.key.keysym.sym)
                    		{
            
                        		case SDLK_UP:
                           			t_MarioActuel = t_Mario[HAUT];
                            		movePlayer(map, &positionJoueur, HAUT);
                            		break;
                        		case SDLK_DOWN:
                            		t_MarioActuel = t_Mario[BAS];
                            		movePlayer(map, &positionJoueur, BAS);
                            		break;
                        		case SDLK_RIGHT:
                            		t_MarioActuel = t_Mario[DROITE];
                           		 	movePlayer(map, &positionJoueur, DROITE);
                            		break;
                        		case SDLK_LEFT:
                            		t_MarioActuel = t_Mario[GAUCHE];
                            		movePlayer(map, &positionJoueur, GAUCHE);
                            		break;
            
                                case SDLK_ESCAPE:
                                    game_Launch = SDL_FALSE;
                                    break;
                                case SDLK_c:
                                    SDL_RenderClear(pRender);
                                    break;
            
                    		}
                            default:
                                continue;
            		}
            
                    remainObjective = 0;
            
                    SDL_RenderClear(pRender);
            
                    for (i = 0 ; i < NB_BLOCK_WIDTH ; i++)
                    {
                        for (j = 0 ; j < NB_BLOCK_HEIGHT ; j++)
                        {
                            position.x = i * SIZE_BLOCK;
                            position.y = j * SIZE_BLOCK;
            
                            switch(map[i][j])
                            {
                                case MUR:
                                    if(SDL_RenderCopy(pRender, t_Mur, NULL, &position) != 0)
                                        SDL_ExitWithEroor("impossible d'afficher la texture");
                                    break;
                                case CAISSE:
                                    if(SDL_RenderCopy(pRender, t_Caisse, NULL, &position) != 0)
                                        SDL_ExitWithEroor("impossible d'afficher la texture");
                                    break;
                                case OBJECTIF:
                                    if(SDL_RenderCopy(pRender, t_Objectif, NULL, &position)!= 0)
                                        SDL_ExitWithEroor("impossible d'afficher la texture");
                                    remainObjective = 1;
                                    break;
                                case CAISSE_OK:
                                    if(SDL_RenderCopy(pRender, t_CaisseOK, NULL, &position) != 0)
                                        SDL_ExitWithEroor("impossible d'afficher la texture");
                                    break;
                            }
                        }
                    }
            
                    if (!remainObjective)
                    {
                        printf("partie gagner \n");
                        game_Launch = SDL_FALSE;
                    }
            
                    position.x = positionJoueur.x * SIZE_BLOCK;
                    position.y = positionJoueur.y * SIZE_BLOCK;
                    SDL_RenderCopy(pRender, t_MarioActuel, NULL, &position);
            
                    SDL_RenderPresent(pRender);
                }
            
                SDL_DestroyTexture(t_Mur);
                SDL_DestroyTexture(t_Caisse);
                SDL_DestroyTexture(t_Objectif);
                SDL_DestroyTexture(t_CaisseOK);
                for(i = 0; i < 4; i++)
                    SDL_DestroyTexture(t_Mario[i]);
            }
            
            void movePlayer(int map[][NB_BLOCK_HEIGHT], SDL_Rect *pos, int direction)
            {
            
                switch(direction)
                {
                    case HAUT:
                    {
            
            
                        if(pos->y - 1 < 0)
                            break;
                        if (map[pos->x][pos->y - 1] == MUR) // S'il y a un mur, on arrête
                            break;
                        // Si on veut pousser une caisse, il faut vérifier qu'il n'y a pas de mur derrière (ou une autre caisse, ou la limite du monde)
                        if((map[pos->x][pos->y - 1] == CAISSE || map[pos->x][pos->y - 1] == CAISSE_OK) && (pos->y - 2 < 0 ||
                            map[pos->x][pos->y - 2] == MUR || map[pos->x][pos->y - 2] == CAISSE || map[pos->x][pos->y - 2] == CAISSE_OK))
                            break;
            
            
                        if(!moveBox(&map[pos->x][pos->y - 1], &map[pos->x][pos->y - 2]))
                            SDL_ExitWithEroor("Direction Gauche: la caisse n'a pas put etre deplacer \n");
            
                        pos->y--;
                        break;
                    }
            
                    case BAS:
                    {
            
            
                        if(pos->y + 1 < HEIGHT_WINDOW)
                            break;
                        if (map[pos->x][pos->y - 1] == MUR) // S'il y a un mur, on arrête
                            break;
                        // Si on veut pousser une caisse, il faut vérifier qu'il n'y a pas de mur derrière (ou une autre caisse, ou la limite du monde)
                        if((map[pos->x][pos->y + 1] == CAISSE || map[pos->x][pos->y + 1] == CAISSE_OK) && (pos->y + 2 < HEIGHT_WINDOW ||
                            map[pos->x][pos->y + 2] == MUR || map[pos->x][pos->y + 2] == CAISSE || map[pos->x][pos->y + 2] == CAISSE_OK))
                            break;
            
            
                        if(!moveBox(&map[pos->x][pos->y + 1], &map[pos->x][pos->y + 2]))
                            SDL_ExitWithEroor("Direction BAS: la caisse n'a pas put etre deplacer \n");
            
                        pos->y--;
                        break;
                    }
            
                    case GAUCHE:
                    {
            
            
                        if(pos->x - 1 < 0)
                            break;
                        if (map[pos->x - 1][pos->y] == MUR) // S'il y a un mur, on arrête
                            break;
                        // Si on veut pousser une caisse, il faut vérifier qu'il n'y a pas de mur derrière (ou une autre caisse, ou la limite du monde)
                        if((map[pos->x - 1][pos->y] == CAISSE || map[pos->x - 1][pos->y] == CAISSE_OK) && (pos->x - 2 < 0 ||
                            map[pos->x - 2][pos->y] == MUR || map[pos->x - 2][pos->y] == CAISSE || map[pos->x - 2][pos->y] == CAISSE_OK))
                            break;
            
                        if(!moveBox(&map[pos->x - 1][pos->y], &map[pos->x - 2][pos->y]))
                            SDL_ExitWithEroor("Direction Gauche: la caisse n'a pas put etre deplacer \n");
            
                        pos->x--;
                        break;
                    }
            
                    case DROITE:
                    {
            
            
                        if(pos->x + 1 < WIDTH_WINDOW)
                            break;
                        if (map[pos->x + 1][pos->y] == MUR) // S'il y a un mur, on arrête
                            break;
                        // Si on veut pousser une caisse, il faut vérifier qu'il n'y a pas de mur derrière (ou une autre caisse, ou la limite du monde)
                        if((map[pos->x + 1][pos->y] == CAISSE || map[pos->x + 1][pos->y] == CAISSE_OK) && (pos->x + 2 < WIDTH_WINDOW ||
                            map[pos->x + 2][pos->y] == MUR || map[pos->x + 2][pos->y] == CAISSE || map[pos->x + 2][pos->y] == CAISSE_OK))
                            break;
            
                        if(!moveBox(&map[pos->x + 1][pos->y], &map[pos->x + 2][pos->y]))
                            SDL_ExitWithEroor("Direction Droite : la caisse n'a pas put etre deplacer \n");
            
                        pos->x++;
                        break;
                    }
                }
            
            }
            
            int moveBox(int *firstCase, int *secondCase)
            {
                if (*firstCase == CAISSE || *firstCase == CAISSE_OK)
                {
            
                    if (*secondCase == OBJECTIF)
                        *secondCase = CAISSE_OK;
                    else
                        *secondCase = CAISSE;
            
                    if(*firstCase == CAISSE_OK)
                        *firstCase = OBJECTIF;
                    else
                       *firstCase = VIDE;
            
                    return 1;
                }
                return 0;
            } 

            fichier.c

            #include <stdlib.h>
            #include <stdio.h>
            #include <SDL.h>
            
            #include "constantes.h"
            
            
            int loadLevel(int level[][NB_BLOCK_HEIGHT])
            {
                FILE *fic = NULL;
                char lineFic[NB_BLOCK_WIDTH * NB_BLOCK_HEIGHT + 1] = {0};
                int i = 0, j = 0;
            
                fic = fopen("src/niveau.lvl", "r");
                if(fic == NULL)
                {
                    printf("fichier non charger");
                    return 0;
                }
            
                fgets(lineFic, NB_BLOCK_WIDTH * NB_BLOCK_HEIGHT + 1, fic);
                printf("niveau charger \n");
            
            
                for (i = 0; i < NB_BLOCK_WIDTH; i++)
                    for (j = 0; j < NB_BLOCK_HEIGHT; j++)
                        level[i][j] = lineFic[i * NB_BLOCK_WIDTH + j] - '0';
            
                fclose(fic);
                return 1;
            }
            
            int saveLevel(int level[][NB_BLOCK_HEIGHT])
            {
                FILE* fic = NULL;
                int i = 0, j = 0;
            
                fic = fopen("src/niveau.lvl", "w");
                if (fic == NULL)
                    return 0;
            
                for (i = 0 ; i < NB_BLOCK_WIDTH ; i++)
                    for (j = 0 ; j < NB_BLOCK_HEIGHT ; j++)
                        fprintf(fic, "%d", level[j][i]);
            
                printf("sauvegarde effectué !\n");
            
                fclose(fic);
                return 1;
            }
            
            void SDL_ExitWithEroor(const char *message)
            {
                SDL_Log("ERREUR : %s > %s\n", message, SDL_GetError());
                exit(EXIT_FAILURE);
            }
            
            void SDL_DestroyWIndowAndRanderer(SDL_Window *p_Window, SDL_Renderer *p_Render)
            {
                printf("fenetre et rendu suprime\n");
            	SDL_DestroyRenderer(p_Render);
                SDL_DestroyWindow(p_Window);
            }
            
            





            -
            Edité par Tox-67 10 juillet 2018 à 21:43:18

            • Partager sur Facebook
            • Partager sur Twitter
              10 juillet 2018 à 22:20:36

              Hello,

              Je n'ai pas tout analysé, les n° des lignes indiqués sont ceux de jeu.c

              Ligne 111, tu mets remainObjective à 0. J'imagine que tu n'arrives ligne 132 (case OBJECTIF) que si mario se déplace sur son objectif. À ce moment seulement, tu mets remainObjective à 1.

              Donc, si mario n'est pas sur l'objectif, le test ligne 145 est vrai (!0 est vrai), donc game_lauch est mis à faux, donc tu quittes le while, et bye bye la fonction jeu().

              -
              Edité par edgarjacobs 10 juillet 2018 à 22:28:33

              • Partager sur Facebook
              • Partager sur Twitter

              On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                10 juillet 2018 à 22:51:51

                Salut,

                Le conseil le plus important n'a pas été pris en compte, faire des petites fonctions. En faisant des petites fonctions, tu peux les tester une à une plus facilement, et ça t'aurait permis de te rendre compte que ton affichage n'est pas fait correctement.

                1. Tu ne donnes jamais la couleur à utiliser pour nettoyer l'écran (=> SDL_SetRenderDrawColor).
                2. Tu utilises SDL_RenderCopy, mais tu ne donnes pas de dimensions au rectangle à utiliser ( => donner des valeurs au champ w et h de position).
                • Partager sur Facebook
                • Partager sur Twitter
                Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                  11 juillet 2018 à 16:28:20

                  Bonjours

                  Merci pour vos retour,

                  edgarjacobs a écrit:

                  Ligne 111, tu mets remainObjective à 0. J'imagine que tu n'arrives ligne 132 (case OBJECTIF) que si mario se déplace sur son objectif. À ce moment seulement, tu mets remainObjective à 1.

                  Donc, si mario n'est pas sur l'objectif, le test ligne 145 est vrai (!0 est vrai), donc game_launch est mis à faux, donc tu quittes le while, et bye bye la fonction jeu().


                  j'ai vérifier, pas de soucis de se coter la (j'ai enlever la condition temporairement), enfaite quand je lance ma fonction "play()" cela ne s'actualise pas (le menu reste afficher), par contre si j'appuis sur les Fleche de direction le jeux crash quand je rencontre une caisse et que j'essaie de la déplacer avec pour message dans ma console "Surface doesn't have a colorkey".

                  Pour ce qui est de "w" et "h" je les déclarer au  début en même temps que le rectangle position j'ai tester de les redéclarer en même temps que x et y dans mon coter mais cela ne change rien.

                  -
                  Edité par Tox-67 11 juillet 2018 à 16:29:27

                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 juillet 2018 à 16:32:33

                    Peut-on avoir le nouveau code ?

                    PS : ce serait mieux d'avoir le code sur un paste ou encore mieux sur Github avec tous les fichiers nécessaires histoire qu'on puisse compiler et tester.

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                      11 juillet 2018 à 17:04:29

                      Je vais voire comment fonctionne Github en attendant je te poste un lien pour mon dossier :

                      https://drive.google.com/open?id=1SaK3mnm5ly9fGBvyC0qvXkPP_AejnpSW

                      -
                      Edité par Tox-67 11 juillet 2018 à 17:11:55

                      • Partager sur Facebook
                      • Partager sur Twitter
                        11 juillet 2018 à 17:31:02

                        Alors,

                        • Dans le default du switch de ta boucle principale, regarde ce que tu as mis.
                        • Pourquoi &amp;*pos dans tes appels à hitBox ? Envoie pos.
                        • Pourquoi appeler SDL_ExitWithError s'il y a une erreur de déplacement de la caisse ? S'il y a un problème, il n'a aucun rapport avec la SDL, et pourtant ça fait que tu appelles SDL_GetError. De plus, pourquoi vérifier la fonction moveBox.
                        • Ta fonction hitBox n'est pas correcte. Que se passe-t-il s'il n'y a rien devant toi, pas de caisse, pas de mur, mais juste du vide ? Tu renvoies 1 et donc on essaie ensuite de bouger la caisse, ce qui conduit à l'échec de moveBox et donc à l'appel de SDL_ExitWiethEroor (ce serait mieux avec Error).

                        -
                        Edité par yo@n97one 11 juillet 2018 à 21:04:04

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                          12 juillet 2018 à 12:42:16

                          Bonjour,

                          Effectivement c'était bien le "continue" du "switch" qui empêchait l'affichage des Texture :D, j'ai aussi corriger ma fonction "hitBox()" de manière a pouvoir me déplacer en cas de case vide, par contre si j'envoie "pos" en paramètre sa ne fonctionne pas j'obtiens une erreur.

                          j'ai encore un soucis sur les déplacement des caisse en direction bas et droite mais le gros de mon soucis est réglé.

                          Merci Beacoup !

                          mon code actuelle : https://drive.google.com/open?id=1Tap0HJac5EU1vSise5ROBbnJP162pkvw

                          • Partager sur Facebook
                          • Partager sur Twitter
                            12 juillet 2018 à 13:20:28

                            Je viens d'essayer avec pos, pas de problème. Pour les problèmes de déplacement des caisses, regarde du côté de moveBox, de hitBox et des arguments que tu donnes.

                            Après, tes fonctions sont plutôt compliquées. Notamment, pourquoi retourner 1 ou 2 dans hitBox si on ne touche rien (d'ailleurs, il manque aussi le cas de l'objectif). En fait, on pourrait même avoir beaucoup, mais beaucoup plus de fonctions.

                            • Une fonction qui dit si une case est vide (c'est-à-dire VIDE ou OBJECTIF).
                            • Une fonction qui dit si une case est une caisse.
                            • Une fonction qui dit si la case devant nous est libre.
                            • Un fonction qui nous dit si la case encore après est libre.
                            • Une fonction qui nous dit s'il y a une caisse devant nous.

                            Avec tout ça il est facile de savoir si on peut se déplacer.

                            Si devant nous c'est libre
                                C'est OK, on le déplace
                            Sinon si devant nous il y a une caisse
                                Si la case encore après est libre
                                    C'est OK, on déplace la caisse, et on le déplace
                            
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                              24 juillet 2018 à 18:32:31

                              Bonjours !

                              je viens de rentré de vacance et du coup de terminer le TP ,

                              tout fonctionne enfin parfaitement,

                              merci du coup de main et de tes conseil !! :D

                              mon code Actuelle : https://drive.google.com/open?id=1eJIe4rOlzFeMFQpfJY0zsNmghTUnDTrR

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Problème mario sokoban

                              × 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