Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SFML] Pong

Saccadé à mort

    18 novembre 2007 à 15:09:28

    Bonjour tout le monde, c'est encore moi.
    Bon, cette fois ci j'ai fait un pong avec la SFML pour me familiariser à la librairy, mais une fois le jeu terminé, je m'aperçois que c'est injouable, tellement c'est saccadé.
    Je vous donne le code des troi fichiers :
    main.cpp :
    1. #include <SFML/Graphics.hpp>
    2. #include "moteur.h"
    3. using namespace sf;
    4. int main()
    5. {
    6.     //On initialise ici les variables nécessaires au jeu :
    7.     //La fenêtre
    8.     RenderWindow App(VideoMode(800, 600), "Pong, par Mickaël MONTESSINOS");
    9.     App.SetBackgroundColor(Color(0, 0, 0));
    10.     //Les Images
    11.     Image barre(200, 200, Color(255, 255, 255));
    12.     barre.LoadFromFile("barre.png");
    13.     Image balle(200, 200, Color(255, 255, 255));
    14.     balle.LoadFromFile("balle.png");
    15.     //Les sprites
    16.     Sprite BarreGauche;
    17.     BarreGauche.SetImage(barre);
    18.     float BarreGaucheY = ((800 / 2) - (BarreGauche.GetHeight()));
    19.     BarreGauche.Move(3, BarreGaucheY);
    20.     Sprite BarreDroite;
    21.     BarreDroite.SetImage(barre);
    22.     float BarreDroiteY = ((800 / 2) - (BarreDroite.GetHeight()));
    23.     BarreDroite.Move(780, BarreDroiteY);
    24.     Sprite Balle;
    25.     Balle.SetImage(balle);
    26.     Balle.Move(390, 290);
    27.     //Et enfin, diverses variables nécessaires
    28.     Event Event;
    29.     const Input& Input = App.GetInput();
    30.     Clock Clock;
    31.     long TempsPrecedent = 0;
    32.     Moteur Moteur;
    33.     bool Running = true;
    34.     Clock.Reset();
    35.     while (Running)
    36.     {
    37.         if(App.GetEvent(Event)) //Si il y a un evenement
    38.         {
    39.             switch(Event.Type)
    40.             {
    41.                 case Event::Close :
    42.                     Running = false;
    43.                     break;
    44.                 case Event::KeyReleased :
    45.                     if(Event.Key.Code == Key::Escape)
    46.                     Running = false;
    47.                     break;
    48.             }
    49.         }
    50.         //On utilise les Input pour pouvoir gérer plusieurs mouvement simultanés
    51.         if(Input.IsKeyDown(Key::Up) && (Clock.GetElapsedTime() - TempsPrecedent) >= 0.1)
    52.             Moteur.BougerBarre(BarreDroite, HAUT);
    53.         if(Input.IsKeyDown(Key::Down) && (Clock.GetElapsedTime() - TempsPrecedent) >= 0.1)
    54.             Moteur.BougerBarre(BarreDroite, BAS);
    55.         if(Input.IsKeyDown(Key::Z) && (Clock.GetElapsedTime() - TempsPrecedent) >= 0.1)
    56.             Moteur.BougerBarre(BarreGauche, HAUT);
    57.         if(Input.IsKeyDown(Key::S) && (Clock.GetElapsedTime() - TempsPrecedent) >= 0.1)
    58.             Moteur.BougerBarre(BarreGauche, BAS);
    59.         //On vérifie si un point est marqué
    60.         Moteur.Point(Balle);
    61.         //Si il c'est passé un centième de secondes
    62.         if((Clock.GetElapsedTime() - TempsPrecedent) >= 0.75)
    63.         //on bouge la balle
    64.         {
    65.         Moteur.BougerBalle(Balle, BarreGauche, BarreDroite);
    66.         TempsPrecedent = Clock.GetElapsedTime();
    67.         //Et on remet le compteur à Zéro
    68.         }
    69.         //Enfin, on affiche tout
    70.         App.Draw(BarreGauche);
    71.         App.Draw(BarreDroite);
    72.         App.Draw(Balle);
    73.         App.Display();
    74.     }
    75.     return 0;
    76. }


    moteur.cpp :
    1. #include <SFML/Graphics.hpp>
    2. #include "moteur.h"
    3. using namespace sf;
    4. Moteur::Moteur() : M_DirectionBalleX(GAUCHE), M_DirectionBalleY(BAS)
    5. {
    6. }
    7. void Moteur::BougerBarre(Sprite &Barre, Direction Direction)
    8. {
    9.         float BarreTop = Barre.GetTop();
    10.         switch(Direction)
    11.         {
    12.                 case HAUT :
    13.                     if (!(BarreTop <= 0)) //SI la barre ne touche pas le haut
    14.                     {
    15.                     BarreTop -= 2; //Elle monte
    16.                     Barre.SetTop(BarreTop);
    17.                     }
    18.                     break;
    19.                 case BAS :
    20.                     if(!((BarreTop + Barre.GetHeight()) >= 600)) //Si elle n'est pas en bas,
    21.                     {
    22.                     BarreTop += 2; //Elle descend
    23.                     Barre.SetTop(BarreTop);
    24.                     }
    25.         }
    26. }
    27. void Moteur::BougerBalle(Sprite &Balle, const Sprite BarreUn, const Sprite BarreDeux)
    28. {
    29.     float BarreUnTop = BarreUn.GetTop();
    30.     float BarreDeuxTop = BarreDeux.GetTop();
    31.     //Si la balle touhe la barre gauche
    32.     if(Balle.GetLeft() <= (3 + BarreUn.GetWidth()) && Balle.GetTop() <= (BarreUnTop + BarreUn.GetHeight()) &&
    33.     (Balle.GetTop() + Balle.GetHeight()) >= BarreUnTop)
    34.     {
    35.         switch (M_DirectionBalleY) //On change a direction verticale
    36.         {
    37.             case HAUT :
    38.                 M_DirectionBalleY = BAS;
    39.                 break;
    40.             case BAS :
    41.                 M_DirectionBalleY = HAUT;
    42.         }
    43.         M_DirectionBalleX = DROITE; //Et on repart vers la droite
    44.     }
    45.     //Si elle touche celle de droite
    46.     else if(Balle.GetLeft() >= (BarreDeux.GetLeft() - Balle.GetWidth()) && Balle.GetTop() <= (BarreDeuxTop + BarreDeux.GetHeight()) &&
    47.     (Balle.GetTop() + Balle.GetHeight()) >= BarreDeuxTop)
    48.     {
    49.         //On change la direction verticale
    50.         switch (M_DirectionBalleY)
    51.         {
    52.             case HAUT :
    53.                 M_DirectionBalleY = BAS;
    54.                 break;
    55.             case BAS :
    56.                 M_DirectionBalleY = HAUT;
    57.         } //Et on repart vers la gauche
    58.         M_DirectionBalleX = GAUCHE;
    59.     }
    60.     else if(Balle.GetTop() <= 0) //Si la balle touche en haut
    61.     M_DirectionBalleY = BAS; //Elle repart vers le bas
    62.     else if(Balle.GetTop() >= (600 - Balle.GetHeight())) //Et si elle touche en bas
    63.     M_DirectionBalleY = HAUT; //Elle repart vers le haut
    64.     float BalleLeft = Balle.GetLeft();
    65.     float BalleTop = Balle.GetTop();
    66.     //On modifie les coordonnées de la balle selon la direction
    67.         if(M_DirectionBalleX == GAUCHE)
    68.         BalleLeft -= 2;
    69.         else
    70.         BalleLeft += 2;
    71.         if(M_DirectionBalleY == HAUT)
    72.         BalleTop -=2;
    73.         else
    74.         BalleTop += 2;
    75.     //Et on la bouge
    76.     Balle.SetLeft(BalleLeft);
    77.     Balle.SetTop(BalleTop);
    78. }
    79. void Moteur::Point(Sprite &Balle)
    80. {
    81.     if(Balle.GetLeft() <= 0 || Balle.GetLeft() >= 800)  //Si la balle sort
    82.     {
    83.     //On la remet au millieu
    84.     long BalleLeft = (400 - Balle.GetWidth());
    85.     long BalleTop = (300 - Balle.GetHeight());
    86.     Balle.SetLeft(BalleLeft);
    87.     Balle.SetTop(BalleTop);
    88.     }
    89. }



    moteur.h :
    1. #ifndef MOTEUR
    2. #define MOTEUR
    3. using namespace sf;
    4. enum Direction
    5. {
    6.     HAUT, BAS, GAUCHE, DROITE
    7. };
    8. class Moteur
    9. {
    10.     public :
    11.         Moteur();
    12.         void BougerBarre(Sprite &Barre, Direction Direction);
    13.         void BougerBalle(Sprite &Balle, const Sprite BarreUn, const Sprite BarreDeux);
    14.         void Point(Sprite &Balle);
    15.     protected :
    16.         Direction M_DirectionBalleX;
    17.         Direction M_DirectionBalleY;
    18. };
    19. #endif


    Enfin, voici les images du jeux :
    La balle :
    Image utilisateur
    Et la barre :
    Image utilisateur

    Merci de m'aider
    • Partager sur Facebook
    • Partager sur Twitter
      18 novembre 2007 à 19:17:58

      J'avoue que c'est très étrange... Ton accélération 3D est activée ?
      • Partager sur Facebook
      • Partager sur Twitter
        18 novembre 2007 à 19:40:48

        il faut savoir que Clock.GetElapsedTime() retourne une valeur en seconde, et 0.1 équivaut à un dixième de seconde, et 0.75, à presque une seconde. le code serait peut-être mieux ainsi :

        1. //On utilise les Input pour pouvoir gérer plusieurs mouvement simultanés
        2.         if(Input.IsKeyDown(Key::Up) && (Clock.GetElapsedTime() - TempsPrecedent) >= 0.01)
        3.             Moteur.BougerBarre(BarreDroite, HAUT);
        4.         if(Input.IsKeyDown(Key::Down) && (Clock.GetElapsedTime() - TempsPrecedent) >= 0.01)
        5.             Moteur.BougerBarre(BarreDroite, BAS);
        6.         if(Input.IsKeyDown(Key::Z) && (Clock.GetElapsedTime() - TempsPrecedent) >= 0.01)
        7.             Moteur.BougerBarre(BarreGauche, HAUT);
        8.         if(Input.IsKeyDown(Key::S) && (Clock.GetElapsedTime() - TempsPrecedent) >= 0.01)
        9.             Moteur.BougerBarre(BarreGauche, BAS);
        10.         //On vérifie si un point est marqué
        11.         Moteur.Point(Balle);
        12.         //Si il c'est passé un centième de secondes
        13.         if((Clock.GetElapsedTime() - TempsPrecedent) >= 0.075)


        j'ai pas testé, mais ça doit aider ;)
        • Partager sur Facebook
        • Partager sur Twitter
        Altarapp.com - Applications, Code Snippets, API Wrappers et etc, le tout en C# le plus clair du temps!
          19 novembre 2007 à 16:26:45

          AAAAAAAAAAAHHH!!!! un programme dans le main!
          • Partager sur Facebook
          • Partager sur Twitter
            19 novembre 2007 à 17:05:35

            Pas besoin d'en faire un drame... -_-;
            • Partager sur Facebook
            • Partager sur Twitter
            Altarapp.com - Applications, Code Snippets, API Wrappers et etc, le tout en C# le plus clair du temps!
              19 novembre 2007 à 21:18:33

              Citation : MatteX

              AAAAAAAAAAAHHH!!!! un programme dans le main!



              Pour un ptit pong, spa la mort non plus, surtout que c'est pour tester la SFML ¬_¬
              • Partager sur Facebook
              • Partager sur Twitter
                20 novembre 2007 à 11:40:38

                Merci pour vos réponses, en effet, j'ai fait le programme dans le main, parce que je voulais juste vérifier si j'avais bien compris l'utilisation de la SFML.

                Il y a peu de chances que le problème vienne de mon ordinateur, je joue beaucoup et je ne rencontre jamais de problèmes de ce genre,de plus, j'ai testé le programme sur un autre ordinateur, et le problème était le même, je vais éssayer le morceau de code de shadosan pour voir.


                Edit : Je ne vois plus de raletissements, mais la balle bouge trop vite, je vais éssayer de régler ça.
                Merci
                Ah non, en fait, plus la balle vas vite, plus les ralentissements sont cours, mais ils sont quand même là...
                • Partager sur Facebook
                • Partager sur Twitter
                  20 novembre 2007 à 13:53:30

                  salut, essaye
                  1. App.SetFrameLimits(100);
                  au début de ton code, pour diminuer le nombre d'image par seconde)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 novembre 2007 à 16:51:12

                    Citation : fsx999

                    salut, essaye

                    1. App.SetFrameLimits(100);

                    au début de ton code, pour diminuer le nombre d'image par seconde)


                    ça serais pas mieux App.UseVerticalSync(true); ?

                    et le meilleur serais que tu change ton code pour qu'il utilise un peu mieux le temps, sans utiliser de condition... Tiens, une page tiré du tuto SFML qui t'en apprendra un peu plus :

                    Gérer le temps
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Altarapp.com - Applications, Code Snippets, API Wrappers et etc, le tout en C# le plus clair du temps!
                      21 novembre 2007 à 13:48:19

                      Merci, j'ai suivit tes conseils et mon pong ne rame plus, merci beaucoup ^^
                      • Partager sur Facebook
                      • Partager sur Twitter

                      [SFML] Pong

                      × 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