Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème d'incrémentation dans un case:

Ma fenetre se ferme

    18 juillet 2006 à 20:40:01

    Bonjour tout le monde j'ai un petit problème avec un incrémentation (k++) dans un switch d'abord voila mon code


            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;
                        case BOULE_MAGIQUE:
                            SDL_BlitSurface(boule_magique, NULL, ecran, &position);
                            positionBoule_magique[k].x = position.x;
                            positionBoule_magique[k].y = position.y;
                           
                            break;
                    }
                }
            }


    EDIT: et quand je met un k++ (dans BOULE_MAGIQUE pour avoir les position de chaqune des boule) ma fenetre se ferme directement:

    POURQUOI?


    Quelle que soit la case ou je met le k++ l'erreur se produit aidez moi svp :)
    • Partager sur Facebook
    • Partager sur Twitter
      19 juillet 2006 à 13:05:06

      S'il vous plait aidez un pauvre zero a qui la chance ne sourit jamais :(
      • Partager sur Facebook
      • Partager sur Twitter
        19 juillet 2006 à 14:02:19

        est tu sur que le tableau boule magique []
        n'est pas trop petit ?

        boule[5]
        et k = 6 -> boule[k] == BUG
        • Partager sur Facebook
        • Partager sur Twitter
          19 juillet 2006 à 14:09:01

          Sur la carte y'a 3 boule magique j'ai donc fait:


          SDL_Rect positionBoule_magique[3];

          et ca ne fonctionne pas j'ai esseyé [100] au cas ou mais tjr rien :(
          • Partager sur Facebook
          • Partager sur Twitter
            20 juillet 2006 à 12:57:59

            S'il vous plaiiiiitttt aidez-moi ou je serais dans l'obligation de me suicider :(
            please help me!!!
            • Partager sur Facebook
            • Partager sur Twitter
              20 juillet 2006 à 15:08:45

              tu mets bien k = 0 avant ta boucle ?
              • Partager sur Facebook
              • Partager sur Twitter
                20 juillet 2006 à 16:06:42

                alors j'ai initialisé k=0; avec toute mes autres variable et comme je l'ai dit quand je met un k++ dans ma boucle ma fenetre s'ouvre et se ferme directement si je met autre chose (l++) ma fenetre ne se ferme pas mais la position :
                positionBoule_Magike[k] sera toujour celle du [0] donc il n'y aura que ma derniere boule qui sera pris en conte (d'ou le k++)
                Ensuite, si je met k=0; juste avant la boucle la fenetre ne se ferme pas mais j'ai l'impression que les positions ne sont pas enregistré voila la suite de mon code qui gere le contact avec la boule:


                /*gestion des évenement spéciaux*/

                      //si pacman prend une des boulles magique
                    for(l=0; l<3; l++)//on teste toute les position des boules et on regarde si pacman est dessus
                          {
                              if(positionJoueur.x == positionBoule_magique[l].x && positionJoueur.y == positionBoule_magique[l].y)
                              {
                                   tempsSuperPacman = SDL_GetTicks();//on initialise au temps actuel
                                   superPacman = 1;
                              }
                          }
                      //si le fantome et pacman se touchent
                       if(positionJoueur.x == positionFantomeVert.x && positionJoueur.y == positionFantomeVert.y)
                       {
                           tempsActuel3 = SDL_GetTicks();//le temps actuel ets actualisé
                           if(tempsActuel3 - tempsSuperPacman < 20000 && superPacman == 1)//si il y a moins de 20 seconde entre le contact ac le fantome et la boule
                           {
                               positionFantomeVert.x = 12;//le fantome se retrouve téléporter au milieu du jeu
                               positionFantomeVert.y = 9;
                           }
                           else//si il y a plus de 20secondes le fantome mange pacman donc on arrete le jeu
                           {
                              continuer = 0;
                           }
                       }



                voila ce que c'est censé faire:
                Si PAcman rentre en contact avec une boule alors il est capable pendant 20seconde de manger le fantome et le renvoyer au milieu de la carte, après ces 20 seconde si il rentre en contact avec le fantome la fenetre se ferme.
                Mais quoi que je fasse aucune boule ne fonctionne
                • Partager sur Facebook
                • Partager sur Twitter
                  21 juillet 2006 à 21:14:28

                  elles sont de quels type tes variables : tempsActuel3 et tempsSuperPacman ?

                  tu es sur de ton test ? il est peu etre toujours faux ! tu fai afficher quelque chose a ton programme si la condition est fausse (par exemple les valeurs de tempsActuel3 et tempsSuperPacman) comme ca tu peut voir d'où vien le bug (enfin t'as un chance de voir d'où il vien)
                  ou
                  fait les deux test avant le "if " et utilise un booleen

                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 juillet 2006 à 22:13:06

                    les variables temps sont de type Uint32

                    Le problème ne vient pas de mon test (j'ai esseyé de l'enlever entierement mais le problème persiste) quand je met le k++ ma fenetre se ferme dès l'ouverture et si je ne met pas le k++ les positions que chaque éléments boule ne sont pas enregistrées dans les positions donc forcément le teste est toujours faux.
                    bon je vais posez toute ma partie jeu peut etre qu'il y a une erreur qui par un enchainement a produit cette erreur, un peu comme le fait que mes pieds ce dévie vers l'exterieur c'est a cause de mon appareil dentaire (quand mon ostéopate ma di sa g alluciné mais une fois quil ma expliqué ba g tt compris) bon j'arrete de m'égarer voila le code complet :euh:


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

                    #include "constante.h"
                    #include "jeu.h"
                    #include "fantome.h"
                    #include "fichier.h"
                    #include "deplacement.h"

                    void jouer(SDL_Surface* ecran)
                    {
                        //variable de jeu
                        SDL_Surface *pacman[8];
                        SDL_Surface *mur = NULL, *objectif = NULL, *pacmanActuel = NULL;
                        SDL_Surface *boule_magique = NULL;
                        SDL_Rect position, positionJoueur;
                        SDL_Event event;

                        //variable de fantome vert
                        SDL_Surface *fantomeVert[4];
                        SDL_Surface *fantomeVertActuel = NULL;
                        SDL_Rect positionFantomeVert;

                        //variable de position
                        SDL_Rect positionBoule_magique[3];

                        //variable de comptage
                        int i = 0, j = 0, k = 0, l = 0;
                        int nbBoule_Magique = 0;

                        //initialisation des temps
                        Uint32 tempsActuel = 0, tempsPrecedent = 0;//gere le temp du pacman
                        Uint32 tempsActuel2 = 0, tempsPrecedent2 = 0;//gere le temp du fantome
                        Uint32 tempsActuel3 = 0, tempsSuperPacman = 0; //temps de super pacman

                        //variable autre
                        int continuer = 1, fermer = 1, objectifsRestants = 0;
                        int resultat = 1, superPacman = 0;
                        int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};
                        long mouvementFantome = 0;
                        long min = HAUT, max = DROITE;

                        //chargement des sprites décors, bonus et de la transparance
                        mur = IMG_Load("mur.bmp");
                        SDL_SetColorKey(mur, SDL_SRCCOLORKEY, SDL_MapRGB(mur->format, 0, 0, 0));
                        objectif = IMG_Load("objectif.bmp");
                        SDL_SetColorKey(objectif, SDL_SRCCOLORKEY, SDL_MapRGB(objectif->format, 0, 0, 0));
                        boule_magique = IMG_Load ("boule_magique.bmp");
                        SDL_SetColorKey(boule_magique, SDL_SRCCOLORKEY, SDL_MapRGB(boule_magique->format, 0, 0, 0));

                        //chargement des sprites pacman et de la transparence
                        pacman[BAS] = IMG_Load("pacman_bas_fermer.bmp");
                        SDL_SetColorKey(pacman[BAS], SDL_SRCCOLORKEY, SDL_MapRGB(pacman[BAS]->format, 0, 0, 0));
                        pacman[BAS2] = IMG_Load("pacman_bas_ouvert.bmp");
                        SDL_SetColorKey(pacman[BAS2], SDL_SRCCOLORKEY, SDL_MapRGB(pacman[BAS2]->format, 0, 0, 0));
                        pacman[HAUT] = IMG_Load("pacman_haut_fermer.bmp");
                        SDL_SetColorKey(pacman[HAUT], SDL_SRCCOLORKEY, SDL_MapRGB(pacman[HAUT]->format, 0, 0, 0));
                        pacman[HAUT2] = IMG_Load("pacman_haut_ouvert.bmp");
                        SDL_SetColorKey(pacman[HAUT2], SDL_SRCCOLORKEY, SDL_MapRGB(pacman[HAUT2]->format, 0, 0, 0));
                        pacman[GAUCHE] = IMG_Load("pacman_gauche_fermer.bmp");
                        SDL_SetColorKey(pacman[GAUCHE], SDL_SRCCOLORKEY, SDL_MapRGB(pacman[GAUCHE]->format, 0, 0, 0));
                        pacman[GAUCHE2] = IMG_Load("pacman_gauche_ouvert.bmp");
                        SDL_SetColorKey(pacman[GAUCHE2], SDL_SRCCOLORKEY, SDL_MapRGB(pacman[GAUCHE2]->format, 0, 0, 0));
                        pacman[DROITE] = IMG_Load("pacman_droite_fermer.bmp");
                        SDL_SetColorKey(pacman[DROITE], SDL_SRCCOLORKEY, SDL_MapRGB(pacman[DROITE]->format, 0, 0, 0));
                        pacman[DROITE2] = IMG_Load("pacman_droite_ouvert.bmp");
                        SDL_SetColorKey(pacman[DROITE2], SDL_SRCCOLORKEY, SDL_MapRGB(pacman[DROITE2]->format, 0, 0, 0));
                        pacmanActuel = pacman[DROITE];

                        //chargement des sprites fantome et de la transparence
                        fantomeVert[HAUT] = IMG_Load("gosth1_haut.bmp");
                        SDL_SetColorKey(fantomeVert[HAUT], SDL_SRCCOLORKEY, SDL_MapRGB(fantomeVert[HAUT]->format, 0, 0, 0));
                        fantomeVert[BAS] = IMG_Load("gosth1_bas.bmp");
                        SDL_SetColorKey(fantomeVert[BAS], SDL_SRCCOLORKEY, SDL_MapRGB(fantomeVert[BAS]->format, 0, 0, 0));
                        fantomeVert[DROITE] = IMG_Load("gosth1_droite.bmp");
                        SDL_SetColorKey(fantomeVert[DROITE], SDL_SRCCOLORKEY, SDL_MapRGB(fantomeVert[DROITE]->format, 0, 0, 0));
                        fantomeVert[GAUCHE] = IMG_Load("gosth1_gauche.bmp");
                        SDL_SetColorKey(fantomeVert[GAUCHE], SDL_SRCCOLORKEY, SDL_MapRGB(fantomeVert[GAUCHE]->format, 0, 0, 0));
                        fantomeVertActuel = fantomeVert[HAUT];

                        // 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_LARGEUR ; i++)
                        {
                            for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
                            {
                                if (carte[i][j] == PACMAN) // Si Mario se trouve à cette position sur la carte
                                {
                                    positionJoueur.x = i;
                                    positionJoueur.y = j;
                                    carte[i][j] = VIDE;
                                }
                                else if (carte[i][j] == FANTOME_VERT)
                                {
                                    positionFantomeVert.x = i;
                                    positionFantomeVert.y = j;
                                    carte[i][j] = VIDE;
                                }
                            }
                        }




                        while(continuer)//on entre dnas la boucle principale
                        {
                            SDL_PollEvent(&event);

                            switch(event.type)
                            {
                                case SDL_QUIT:
                                    continuer = 0;
                                    break;
                                case SDL_KEYDOWN:
                                    {
                                        tempsActuel = SDL_GetTicks();
                                        if(tempsActuel - tempsPrecedent >= VITESSE)
                                        {
                                            switch(event.key.keysym.sym)//gestion du déplacement de pacman
                                            {
                                            case SDLK_ESCAPE:
                                                continuer = 0;
                                                break;
                                            case SDLK_UP:
                                                if(fermer)
                                                {
                                                    pacmanActuel = pacman[HAUT];
                                                    fermer--;
                                                }
                                                else if(!fermer)
                                                {
                                                    pacmanActuel = pacman[HAUT2];
                                                    fermer++;
                                                }
                                                deplacerJoueur(carte, &positionJoueur, HAUT);
                                                break;
                                            case SDLK_DOWN:
                                                if(fermer)
                                                {
                                                    pacmanActuel = pacman[BAS];
                                                    fermer--;
                                                }
                                                else if(!fermer)
                                                {
                                                    pacmanActuel = pacman[BAS2];
                                                    fermer++;
                                                }
                                                deplacerJoueur(carte, &positionJoueur, BAS);
                                                break;
                                            case SDLK_RIGHT:
                                                if(fermer)
                                                {
                                                    pacmanActuel = pacman[DROITE];
                                                    fermer--;
                                                }
                                                else if(!fermer)
                                                {
                                                    pacmanActuel = pacman[DROITE2];
                                                    fermer++;
                                                }
                                                deplacerJoueur(carte, &positionJoueur, DROITE);
                                                break;
                                            case SDLK_LEFT:
                                                if(fermer)
                                                {
                                                    pacmanActuel = pacman[GAUCHE];
                                                    fermer--;
                                                }
                                                else if(!fermer)
                                                {
                                                    pacmanActuel = pacman[GAUCHE2];
                                                    fermer++;
                                                }
                                                deplacerJoueur(carte, &positionJoueur, GAUCHE);
                                                break;
                                            }
                                            tempsPrecedent = tempsActuel;
                                        }
                                        break;
                                    }
                            }
                            //gestion du déplacement du fantome
                            tempsActuel2 = SDL_GetTicks();
                            if(tempsActuel2 - tempsPrecedent2 >= VITESSE)
                            {
                                do
                                {
                                    srand(time(NULL)%SDL_GetTicks());
                                    mouvementFantome = (rand() % (max - min + 1)) + min;//on défini aléatoirement le mouvement

                                    switch(mouvementFantome)
                                    {
                                        case HAUT:
                                            fantomeVertActuel = fantomeVert[HAUT];
                                            resultat = deplacerFantomeVert(carte, &positionFantomeVert, HAUT);
                                            break;
                                        case BAS:
                                            fantomeVertActuel = fantomeVert[BAS];
                                            resultat = deplacerFantomeVert(carte, &positionFantomeVert, BAS);
                                            break;
                                        case GAUCHE:
                                            fantomeVertActuel = fantomeVert[GAUCHE];
                                            resultat = deplacerFantomeVert(carte, &positionFantomeVert, GAUCHE);
                                            break;
                                        case DROITE:
                                            fantomeVertActuel = fantomeVert[DROITE];
                                            resultat = deplacerFantomeVert(carte, &positionFantomeVert, DROITE);
                                            break;
                                    }
                                }while(resultat);
                                tempsPrecedent2 = tempsActuel2;
                            }

                            //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;
                                        case BOULE_MAGIQUE:
                                            SDL_BlitSurface(boule_magique, NULL, ecran, &position);
                                            positionBoule_magique[k].x = position.x;
                                            positionBoule_magique[k].y = position.y;
                                            k++;//si jle met la fenetre sétein
                                            nbBoule_Magique = k;
                                            break;
                                    }
                                }
                            }
                            // Si on n'a trouvé aucun objectif sur la carte, c'est qu'on a gagné
                            if (!objectifsRestants)
                                continuer = 0;

                           //on place le fantome vert
                           position.x = positionFantomeVert.x * TAILLE_BLOC;
                           position.y = positionFantomeVert.y * TAILLE_BLOC;
                           SDL_BlitSurface(fantomeVertActuel, NULL, ecran, &position);

                           //on place le joueur
                           position.x = positionJoueur.x * TAILLE_BLOC;
                           position.y = positionJoueur.y * TAILLE_BLOC;
                           SDL_BlitSurface(pacmanActuel, NULL, ecran, &position);

                            /*gestion des évenement spéciaux*/
                          //si pacman prend une des boulles magique
                            for(l=0; l<3; l++)//on teste toute les position des boules et on regarde si pacman est dessus
                                {
                                    if(positionJoueur.x == positionBoule_magique[l].x && positionJoueur.y == positionBoule_magique[l].y)
                                    {
                                        tempsSuperPacman = SDL_GetTicks();//on initialise au temps actuel
                                        superPacman = 1;
                                    }
                                }
                            //si le fantome et pacman se touchent
                            if(positionJoueur.x == positionFantomeVert.x && positionJoueur.y == positionFantomeVert.y)
                            {
                                tempsActuel3 = SDL_GetTicks();//le temps actuel ets actualisé
                                if(tempsActuel3 - tempsSuperPacman < 75000 && superPacman == 1)//si il y a moins de 20 seconde entre le contact ac le fantome et la boule
                                {
                                    positionFantomeVert.x = 12;//le fantome se retrouve téléporter au milieu du jeu
                                    positionFantomeVert.y = 9;
                                }
                                else//si il y a plus de 20secondes le fantome mange pacman donc on arrete le jeu
                                {
                                    continuer = 0;
                                }
                            }

                            SDL_Flip(ecran);
                        }

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


                    }



                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 juillet 2006 à 22:27:48

                      Bon, après avoir eu le courage de lire tout le code : le verdict : tu ne remet jamais k à 0 dans la boucle principale ( à moins que je l'ai loupé sinon ben c'est autre chose ) donc à partir de la deuxième fois, ça va aller voir à une position mémoire qui ne lui est pas alloué, ce qui va automatiquement planté.

                      Met un k = 0; juste avant le blit de la carte, ça devrait corriger ton problème.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        22 juillet 2006 à 1:10:41

                        :-° ooops effectivement c'était ca il me semblait l'avoir mis mais j'ai un autre problème je met la partie du code utile:

                        pour l'initialisation des positions des boules magiques

                         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;
                                            case BOULE_MAGIQUE:
                                                SDL_BlitSurface(boule_magique, NULL, ecran, &position);
                                                positionBoule_magique[k].x = position.x;
                                                positionBoule_magique[k].y = position.y;
                                                k++;
                                                nbBoule_Magique = k;
                                                break;
                                        }
                                    }
                                }


                        et la partie qui exploite les positions

                        if(positionJoueur.x == positionFantomeVert.x && positionJoueur.y == positionFantomeVert.y)
                        {
                            tempsActuel3 = SDL_GetTicks();//le temps actuel est actualisé
                            if((tempsActuel3 - tempsSuperPacman) < 20000 && superPacman == 1)//si il y a moins de 20 seconde entre le contact ac le fantome et la boule
                            {
                                positionFantomeVert.x = 12;//le fantome se retrouve téléporter au milieu du jeu
                                positionFantomeVert.y = 9;
                            }
                            else//si il y a plus de 20secondes le fantome mange pacman donc on arrete le jeu
                            {
                                continuer = 0;
                            }
                        }



                        Citation : théoden

                        Voila ce que c'est cencé faire:
                        Si PAcman rentre en contact avec une boule alors il est capable pendant 20seconde de manger le fantome et le renvoyer au milieu de la carte, après ces 20 seconde si il rentre en contact avec le fantome la fenetre se ferme.


                        Mais il n'y a que la derniere boule qui fonctionne correctement les autres ne fonctionne pas aidez moi svp
                        • Partager sur Facebook
                        • Partager sur Twitter

                        problème d'incrémentation dans un case:

                        × 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