Partage
  • Partager sur Facebook
  • Partager sur Twitter

Snake en SFML

problème avec la SFML

Sujet résolu
    14 novembre 2007 à 13:57:57

    Bonjour à tous.
    Dans le cadre d'un concours (désormais fini :p ) j'ai entamé un Snake en SFML mais voila ça coince. Pour l'instant il y a deux problèmes majeurs. Le premier est que quand il rencontre un mur il ne s'arrète pas alors qu'il devrait ... ensuite lorsque le serpent depasse le 11è carré en partant de la gauche le programme plante. Me demander pas pourquoi il a choisi le 11è ^^ Voila je vous laisse tout le code. J essaye de mieux le commenter parce que là ... mais bon je vous le laisse en attendant. Merci à tous, Mizuti

    1. /*
    2. Snake.hpp by Mizzuti & BoB
    3. Rôle : Classe Snake
    4. Date de création : 2 Novembre 2007
    5. Date de dernière modification : 2 Novembre 2007
    6. */
    7. #ifndef DEF_SNAKE
    8. #define DEF_SNAKE
    9. #include "constantes.hpp"
    10. class Snake
    11. {
    12.     public :
    13.     Snake::Snake(int direction, int abscisse, int ordonnee);
    14.     void manger();
    15.     void changerDirection(int carte[][NB_CARRE_HAUT], int direction);
    16.     void deplacer(int carte[][NB_CARRE_HAUT]);
    17.     long getTaille();
    18.     int getAbscisse();
    19.     int getOrdonnee();
    20.     int getDirection();
    21.     protected :
    22.     long m_taille;
    23.     int m_direction;
    24.     int m_abscisse;
    25.     int m_ordonnee;
    26. };
    27. #endif

    1. /*
    2. Snake.cpp by Mizzuti & BoB
    3. Rôle : methodes implémentées de la classe Snake
    4. Date de création : 2 Novembre 2007
    5. Date de dernière modification : 3 Novembre 2007
    6. */
    7. #include "constantes.hpp"
    8. #include "Snake.hpp"
    9.     Snake::Snake(int direction, int abscisse, int ordonnee) : m_taille(3), m_direction(direction), m_abscisse(abscisse*CARRE), m_ordonnee(ordonnee*CARRE)
    10.     {
    11.     }
    12.     void Snake::manger()
    13.     {
    14.         m_taille++;
    15.     }
    16.     void Snake::changerDirection(int carte[][NB_CARRE_HAUT], int direction)
    17.     {
    18.         m_direction = direction;
    19.     }
    20.     void Snake::deplacer(int carte[][NB_CARRE_HAUT])
    21.     {
    22.         int x=getAbscisse();
    23.         int y=getOrdonnee();
    24.         switch(m_direction)
    25.         {
    26.             case HAUT :
    27.                 if(carte[x][y-1] == MUR)
    28.                     break;
    29.                 m_ordonnee-=CARRE;
    30.                 break;
    31.             case BAS :
    32.                 if(carte[x][y+1] == MUR)
    33.                     break;
    34.                 m_ordonnee+=CARRE;
    35.                 break;
    36.             case GAUCHE :
    37.                 if(carte[x-1][y] == MUR)
    38.                     break;
    39.                 m_abscisse-=CARRE;
    40.                 break;
    41.             case DROITE :
    42.                 if(carte[x+1][y] == MUR)
    43.                     break;
    44.                 m_abscisse+=CARRE;
    45.                 break;
    46.         }
    47.     }
    48.     long Snake::getTaille()
    49.     {
    50.         return m_taille;
    51.     }
    52.     int Snake::getDirection()
    53.     {
    54.         return m_direction;
    55.     }
    56.     int Snake::getAbscisse()
    57.     {
    58.         return m_abscisse;
    59.     }
    60.     int Snake::getOrdonnee()
    61.     {
    62.         return m_ordonnee;
    63.     }

    1. /*
    2. constantes.hpp by Mizzuti & BoB
    3. Rôle : constantes
    4. Date de création : 2 Novembre 2007
    5. Date de dernière modification : 2 Novembre 2007
    6. */
    7. #ifndef DEF_CONST
    8. #define DEF_CONST
    9.     #define CARRE 20
    10.     #define NB_CARRE_HAUT 24
    11.     #define NB_CARRE_LARG 32
    12.     #define HAUT_FEN CARRE*NB_CARRE_HAUT
    13.     #define LARG_FEN CARRE*NB_CARRE_LARG
    14.     enum{VIDE, MUR, TETE, QUEUE, CORPS, FRUIT};
    15.     enum{HAUT, BAS, GAUCHE, DROITE};
    16.     enum{HORI, VERTI, GAUCHE_HAUT, GAUCHE_BAS, DROITE_HAUT, DROITE_BAS};
    17. #endif

    1. /*
    2. main.cpp by Mizzuti & BoB
    3. Rôle : menu principal
    4. Date de création : 2 Novembre 2007
    5. Date de dernière modification : 7 Novembre 2007
    6. */
    7. #include <iostream>
    8. #include <SFML/Audio.hpp>
    9. #include <SFML/Graphics.hpp>
    10. #include "constantes.hpp"
    11. #include "jouer.hpp"
    12. using namespace std;
    13. using namespace sf;
    14. int main(int argc, char *argv[])
    15. {
    16.     // Ouverture de la fenetre principal
    17.     RenderWindow menu(VideoMode(LARG_FEN, HAUT_FEN), "SnaXe");
    18.     // Chargement des images
    19.     Image menu_vierge, game, credits, aide, quitter;
    20.     menu_vierge.LoadFromFile("accueil.png");
    21.     game.LoadFromFile("jouer.png");
    22.     credits.LoadFromFile("credits.png");
    23.     aide.LoadFromFile("aide.png");
    24.     quitter.LoadFromFile("quit.png");
    25.     // Chargement des images dans des Sprite
    26.     Sprite accueil(menu_vierge), jeu(game, 150, 185), credit(credits, 150, 325), help(aide, 150, 255), quitt(quitter, 150, 395);
    27.     // boucle principale
    28.     bool continuer = true;
    29.     while (continuer)
    30.     {
    31.         // Evenements
    32.         Event Menu;
    33.         while (menu.GetEvent(Menu))
    34.         {
    35.             // Fermeture de la fenetre : quitter
    36.             switch(Menu.Type)
    37.             {
    38.                 case Event::Close :
    39.                     continuer = false;
    40.                     break;
    41.                 case Event::KeyPressed  :
    42.                     switch(Menu.Key.Code)
    43.                     {
    44.                         case Key::Escape :
    45.                             continuer = false;
    46.                             break;
    47.                     }
    48.                     break;
    49.                 case Event::MouseButtonPressed :
    50.                     switch(Menu.Mouse.Buttons)
    51.                     {
    52.                         case Mouse::Left :
    53.                             if(Menu.Mouse.X >= 150 && Menu.Mouse.X <= 150+jeu.GetWidth() && Menu.Mouse.Y >= 185 && Menu.Mouse.Y <= 185+jeu.GetHeight())
    54.                             {
    55.                                 jouer(menu);
    56.                             }
    57.                             if(Menu.Mouse.X >= 150 && Menu.Mouse.X <= 150+credit.GetWidth() && Menu.Mouse.Y >= 325 && Menu.Mouse.Y <= 325+credit.GetHeight())
    58.                             {
    59.                             }
    60.                             if(Menu.Mouse.X >= 150 && Menu.Mouse.X <= 150+help.GetWidth() && Menu.Mouse.Y >= 255 && Menu.Mouse.Y <= 255+help.GetHeight())
    61.                             {
    62.                             }
    63.                             if(Menu.Mouse.X >= 150 && Menu.Mouse.X <= 150+quitt.GetWidth() && Menu.Mouse.Y >= 395 && Menu.Mouse.Y <= 395+quitt.GetHeight())
    64.                             {
    65.                                 continuer = false;
    66.                             }
    67.                             break;
    68.                     }
    69.             }
    70.         }
    71.         // afficher l'acceuil
    72.         menu.Draw(accueil);
    73.         menu.Draw(jeu);
    74.         menu.Draw(credit);
    75.         menu.Draw(help);
    76.         menu.Draw(quitt);
    77.         // Update de la Fenetre
    78.         menu.Display();
    79.     }
    80.     return EXIT_SUCCESS;
    81. }

    1. /*
    2. jouer.hpp by Mizzuti & BoB
    3. Rôle : prototypes de la fonction principale du jeu
    4. Date de création : 4 Novembre 2007
    5. Date de dernière modification : 7 Novembre 2007
    6. */
    7. #ifndef DEF_JEU
    8. #define DEF_JEU
    9.     void jouer(sf::RenderWindow &ecran);
    10.     void chargerCarte(int niveau[][NB_CARRE_HAUT]);
    11. #endif

    1. /*
    2. jouer.cpp by Mizzuti & BoB
    3. Rôle : fonction principale du jeu
    4. Date de création : 4 Novembre 2007
    5. Date de dernière modification : 7 Novembre 2007
    6. */
    7. #include <SFML/Audio.hpp>
    8. #include <SFML/Graphics.hpp>
    9. #include "Snake.hpp"
    10. #include "constantes.hpp"
    11. #include "jouer.hpp"
    12. using namespace std;
    13. using namespace sf;
    14. void jouer(RenderWindow &ecran)
    15. {
    16.     Snake Serpent(DROITE,2,5);
    17.     Image head[4];
    18.     Image body[6];
    19.     Image tail[4];
    20.     Image wall, empty, apple;
    21.     wall.LoadFromFile("mur.png");
    22.     empty.LoadFromFile("vide.png");
    23.     apple.LoadFromFile("pomme.png");
    24.     head[HAUT].LoadFromFile("tete_haut.png");
    25.     head[BAS].LoadFromFile("tete_bas.png");
    26.     head[DROITE].LoadFromFile("tete_droite.png");
    27.     head[GAUCHE].LoadFromFile("tete_gauche.png");
    28.     body[HORI].LoadFromFile("hori.png");
    29.     body[VERTI].LoadFromFile("verti.png");
    30.     body[GAUCHE_HAUT].LoadFromFile("gauche_haut.png");
    31.     body[GAUCHE_BAS].LoadFromFile("gauche_bas.png");
    32.     body[DROITE_HAUT].LoadFromFile("droite_haut.png");
    33.     body[DROITE_BAS].LoadFromFile("droite_bas.png");
    34.     tail[HAUT].LoadFromFile("queue_haut.png");
    35.     tail[BAS].LoadFromFile("queue_bas.png");
    36.     tail[DROITE].LoadFromFile("queue_droite.png");
    37.     tail[GAUCHE].LoadFromFile("queue_gauche.png");
    38.     for(int k=0; k<4; k++)
    39.     head[k].CreateMaskFromColor(Color::Blue);
    40.     for(int k=0; k<6; k++)
    41.     body[k].CreateMaskFromColor(Color::Blue);
    42.     for(int k=0; k<4; k++)
    43.     tail[k].CreateMaskFromColor(Color::Blue);
    44.     int carte[NB_CARRE_LARG][NB_CARRE_HAUT] = {0};
    45.     chargerCarte(carte);
    46.     Sprite mur(wall), vide(empty), tete(head[DROITE]);
    47.     Clock Clock;
    48.     bool continuer = true;
    49.     while (continuer)
    50.     {
    51.         Event Jeu;
    52.         while (ecran.GetEvent(Jeu))
    53.         {
    54.             switch(Jeu.Type)
    55.             {
    56.                 case Event::KeyPressed  :
    57.                     switch(Jeu.Key.Code)
    58.                     {
    59.                         case Key::Escape :
    60.                             continuer = false;
    61.                             break;
    62.                         case Key::Up :
    63.                             Serpent.changerDirection(carte, HAUT);
    64.                             break;
    65.                         case Key::Down :
    66.                             Serpent.changerDirection(carte, BAS);
    67.                             break;
    68.                         case Key::Right :
    69.                             Serpent.changerDirection(carte, DROITE);
    70.                             break;
    71.                         case Key::Left :
    72.                             Serpent.changerDirection(carte, GAUCHE);
    73.                             break;
    74.                     }
    75.                     break;
    76.                 case Event::Close :
    77.                         continuer = false;
    78.                         break;
    79.             }
    80.         }
    81.                     if(Clock.GetElapsedTime() >= .3)
    82.             {
    83.                 Serpent.deplacer(carte);
    84.                 Clock.Reset();
    85.             }
    86.         for (int i = 0 ; i < NB_CARRE_LARG ; i++)
    87.         {
    88.             for (int j = 0 ; j < NB_CARRE_HAUT ; j++)
    89.             {
    90.                 switch (carte[i][j])
    91.                 {
    92.                     case VIDE :
    93.                         vide.SetLeft(i*CARRE);
    94.                         vide.SetTop(j*CARRE);
    95.                         ecran.Draw(vide);
    96.                         break;
    97.                     case MUR :
    98.                         mur.SetLeft(i*CARRE);
    99.                         mur.SetTop(j*CARRE);
    100.                         ecran.Draw(mur);
    101.                         break;
    102.                 }
    103.             }
    104.         }
    105.         tete.SetImage(head[Serpent.getDirection()]);
    106.         tete.SetLeft(Serpent.getAbscisse());
    107.         tete.SetTop(Serpent.getOrdonnee());
    108.         ecran.Draw(tete);
    109.         ecran.Display();
    110.         }
    111.     }
    • Partager sur Facebook
    • Partager sur Twitter
      14 novembre 2007 à 14:42:16

      Tu as oublié de donné le nom des fichiers...

      Comment fait on pour savoir lequel est le main.cpp ? les .h ?
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        14 novembre 2007 à 14:43:23

        Je doute que beaucoup de monde lise tout ton code, tu ferrais mieux de donner un code source "minimum" reproduisant l'erreur. En même temps c'est un bon exercice pour toi car tu pourras trouver d'où vient le plantage.

        Sebajuste : il a mis les noms en commentaire.
        • Partager sur Facebook
        • Partager sur Twitter
          14 novembre 2007 à 14:49:34

          Moi j'aimerai bien mais le problème c'est qu'avec le strict minimum pour ouvrir la fenêtre lorsque qu'on quittait avec la croix il y avait déjà le problème. C'était certes une fois le programme fermé mais bon le problème est presque le même.
          • Partager sur Facebook
          • Partager sur Twitter

          Snake en SFML

          × 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