Partage
  • Partager sur Facebook
  • Partager sur Twitter

probleme avec mon pacman

    28 juin 2006 à 11:45:33

    Bonjour tout le monde: je suis en train de crée un jeu de pacman en SDL et en suivant le shéma de construction du mario sokoban car je trouve que ces deux jeu fonctionne quasiment pareil a part que dans pacman y'a pas a gerer les caisse et que si pacman touche un objectif on le remplace par du vide


    Je n'ai pas encore mis de fontome... Un lot de problème a la fois sinon on si retrouve plus...


    Je n'ai aucun probleme a la compilation mais a l'éxécution

    Bon je vous donne mon code source (c'est quasiment le même qu'avec sokoban)


    constante.h

    #ifndef DEF_CONSTANTE
    #define CONSTANTE

        #define TAILLE_BLOC         25
        #define NB_BLOCS_LARGEUR    24
        #define NB_BLOCS_HAUTEUR    19
        #define LARGEUR_FENETRE     TAILLE_BLOC * NB_BLOCS_LARGEUR
        #define HAUTEUR_FENETRE     TAILLE_BLOC * NB_BLOCS_HAUTEUR

        enum{HAUT, BAS, GAUCHE, DROITE};
        enum{VIDE, PACMAN, OBJECTIF, MUR};

    #endif




    main.c

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>

    #include "constante.h"
    #include "jeu.h"

    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL, *menu = NULL;
        SDL_Rect positionMenu;
        SDL_Event event;

        int continuer = 1;

        SDL_Init(SDL_INIT_VIDEO);

        ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_WM_SetCaption("PACMAN", NULL);

        menu = IMG_Load("menu.bmp");
        positionMenu.x = 0;
        positionMenu.y = 0;

        while(continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE:
                            continuer = 0;
                            break;
                        case SDLK_KP1:
                            jouer(ecran);
                            break;
                    }
            }
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
            SDL_BlitSurface(menu, NULL, ecran, &positionMenu);
            SDL_Flip(ecran);
        }

        SDL_FreeSurface(menu);
        SDL_Quit();

        return EXIT_SUCCESS;
    }




    jeu.c

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>

    #include "constante.h"
    #include "jeu.h"

    void jouer(SDL_Surface* ecran)
    {
        SDL_Surface *pacman[4];
        SDL_Surface *mur = NULL, *objectif = NULL, *pacmanActuel = NULL;
        SDL_Rect position, positionJoueur;
        SDL_Event event;

        int continuer = 1, objectifsRestants = 0, i = 0, j = 0;
        int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};

        //chargement des sprites
        mur = IMG_Load("mur.bmp");
        objectif = IMG_Load("objectif.bmp");
        pacman[BAS] = IMG_Load("pacman_bas_ouvert.bmp");
        pacman[HAUT] = IMG_Load("pacman_haut_ouvert.bmp");
        pacman[GAUCHE] = IMG_Load("pacman_gauche_ouvert.bmp");
        pacman[DROITE] = IMG_Load("pacman_droite_ouvert.bmp");
        pacmanActuel = IMG_Load("pacman_droite_fermer.bmp");

        // Chargement du niveau
        if (!chargerNiveau(carte))
            exit(EXIT_FAILURE); // On arrête le jeu si on n'a pas pu charger le niveau

        // Recherche de la position de Pacman au départ
        for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
        {
            for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
            {
                if (carte[i][j] == PACMAN) // Si Pacman se trouve à cette position sur la carte
                {
                    positionJoueur.x = i;
                    positionJoueur.y = j;
                    carte[i][j] = VIDE;
                }
            }
        }

        // Activation de la répétition des touches
        SDL_EnableKeyRepeat(50, 50);

        while(continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE:
                            continuer = 0;
                            break;
                        case SDLK_UP:
                            pacmanActuel = pacman[HAUT];
                            deplacerJoueur(carte, &positionJoueur, HAUT);
                            break;
                        case SDLK_DOWN:
                            pacmanActuel = pacman[BAS];
                            deplacerJoueur(carte, &positionJoueur, BAS);
                            break;
                        case SDLK_RIGHT:
                            pacmanActuel = pacman[DROITE];
                            deplacerJoueur(carte, &positionJoueur, DROITE);
                            break;
                        case SDLK_LEFT:
                            pacmanActuel = pacman[GAUCHE];
                            deplacerJoueur(carte, &positionJoueur, GAUCHE);
                            break;
                    }
                    break;
            }

            //fond d'écran noir
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));

            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 OBJECTIF:
                            SDL_BlitSurface(objectif, NULL, ecran, &position);
                            objectifsRestants = 1;
                            break;
                    }
                }
            }
            // Si on n'a trouvé aucun objectif sur la carte, c'est qu'on a gagné
            if (!objectifsRestants)
                continuer = 0;
           //on place le joueur
           position.x = positionJoueur.x * TAILLE_BLOC;
           position.y = positionJoueur.y * TAILLE_BLOC;
           SDL_BlitSurface(pacmanActuel, NULL, ecran, &position);

           SDL_Flip(ecran);

            // Désactivation de la répétition des touches (remise à 0)
           SDL_EnableKeyRepeat(0, 0);

           //libere la mémoire
           SDL_FreeSurface(mur);
           SDL_FreeSurface(objectif);
           for(i=0; i<4; i++)
                SDL_FreeSurface(pacman[i]);

        }


    }

    void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction)
    {
        switch(direction)
        {
            case HAUT:
                if(pos->y - 1 < 0)//si le joueur depasse l'écran on arrete
                    break;
                if(carte[pos->x][pos->y-1] == MUR)//si il y a un mur on arrete
                    break;
                if(carte[pos->x][pos->y-1] == OBJECTIF)//si il y a un objectif on le remplace par du vide
                    carte[pos->x][pos->y-1] = VIDE;
                pos->y--;

            case BAS:
                if(pos->y + 1 > NB_BLOCS_HAUTEUR)//si le joueur depasse l'écran on arrete
                    break;
                if(carte[pos->x][pos->y+1] == MUR)//si il y a un mur on arrete
                    break;
                if(carte[pos->x][pos->y+1] == OBJECTIF)//si il y a un objectif on le remplace par du vide
                    carte[pos->x][pos->y+1] = VIDE;
                pos->y++;

            case GAUCHE:
                if(pos->x - 1 < 0)//si le joueur depasse l'écran on arrete
                    break;
                if(carte[pos->x-1][pos->y] == MUR)//si il y a un mur on arrete
                    break;
                if(carte[pos->x-1][pos->y] == OBJECTIF)//si il y a un objectif on le remplace par du vide
                    carte[pos->x-1][pos->y] = VIDE;
                pos->x--;

            case DROITE:
                if(pos->x + 1 > NB_BLOCS_LARGEUR)//si le joueur depasse l'écran on arrete
                    break;
                if(carte[pos->x + 1][pos->y] == MUR)//si il y a un mur on arrete
                    break;
                if(carte[pos->x+1][pos->y] == OBJECTIF)//si il y a un objectif on le remplace par du vide
                    carte[pos->x+1][pos->y] = VIDE;
                pos->x++;
        }
    }



    fichier.c

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>

    #include "constante.h"
    #include "jeu.h"
    #include"fichier.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("niveaux.lvl", "r");
        if (fichier == NULL)
            return 0;

        fgets(ligneFichier, NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1, fichier);

        for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
        {
            for (j = 0 ; j < NB_BLOCS_LARGEUR ; 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;

                }
            }
        }

        fclose(fichier);
        return 1;
    }

    int sauvegarderNiveau(int niveau[][NB_BLOCS_HAUTEUR])
    {
        FILE* fichier = NULL;
        int i = 0, j = 0;

        fichier = fopen("niveaux.lvl", "w");
        if (fichier == NULL)
            return 0;

        for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
        {
            for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
            {
                fprintf(fichier, "%d", niveau[j][i]);
            }
        }

        fclose(fichier);
        return 1;
    }






    Mon fichier niveaux.lvl contient 012



    Le menu s'affiche correctement et quand j'appuis sur 1 le jeu se lance et la rien ne vas plus les image affiché ne correspondent pas au chiffre du niveaux.lvl et dès qu'un evennement se produit (quel qu'il soit) ma fenetre s'éteind



    Est ce que quelqu'un voudrait bien me répondre svp merci d'avance pour ceux qui auront le courage de plonger dans mon code


    Si vous avez besoin d'autre information n'hésitez pas
    • Partager sur Facebook
    • Partager sur Twitter
      28 juin 2006 à 20:34:07

      1 - Tu oublie de fermer la boucle while avant la desactivation de la repetition des touches ( fonction d'ailleur inutile)

      S'il reste un probleme n'essite pas je crois que si tu corrige celui ci sa iras deja mieux
      • Partager sur Facebook
      • Partager sur Twitter

      probleme avec mon pacman

      × 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