Partage
  • Partager sur Facebook
  • Partager sur Twitter

Les jeux en SDL

Proposez

    10 avril 2006 à 14:38:47

    Bonjour à tous :) !
    Un sujet qui à déja été posté des dizaines de foix...

    Je commence (on donne des idées de jeu à réaliser en SDL):

    pong,
    fire,
    snake,
    casse-brique,
    jeu de vaisseau,
    tetris...
    • Partager sur Facebook
    • Partager sur Twitter
      10 avril 2006 à 16:10:45

      ....C'est quoi "FIRE"... :euh: ?
      • Partager sur Facebook
      • Partager sur Twitter
        10 avril 2006 à 17:19:15

        Heu... En fait, en SDL, on peut à peu près tout faire ce qui est en 2D...
        • Partager sur Facebook
        • Partager sur Twitter
          10 avril 2006 à 17:24:08

          Pacman

          C'etait mon projet d'info de l'année derniere. Mais je devais le faire en java, et on ne savait pas gerer le temps réel, donc c'etait du tour par tour (au fantome1 de jouer, au fantome2 de jouer, à toi de jouer dans quel direction veux-tu aller?)
          Et en plus, on ne savait pas importer d'image, donc il fallait tracer pacman et les fantomes pixel par pixel.

          Par contre, on devait integrer des pastilles spécials, qui faisaient que si on les mangeait, le jeux passait en vu FPS (on etait à la place de Pacman, et on voyais les murs autour de nous). Enfait, ça parait baleze à faire à premiere vue, mais enfait non, faut juste se creuser la tete pour trouver des algorithmes, c'est juste des maths (on dit algorithme et non algorythme, contrairement à ce que je vois souvent lol, car ça vient de l'arabe, et non pas du mot "rythme")

          Par contre... vu qu'on devait le faire en java, on avait acces à la programation orienté objet... j'pense que ça doit etre un peu plus dur en C (qui n'est pas orienté objet, bien que les structures peuvent remplacer)
          • Partager sur Facebook
          • Partager sur Twitter
            10 avril 2006 à 17:28:33

            Citation : Insomniak

            Heu... En fait, en SDL, on peut à peu près tout faire ce qui est en 2D...


            Oui peut - être mais faut être bon dessinateur a moins d'utiliser des images de RPG pour l'herbe ou autres enfin pour certain jeux parce pour un morpion (croix, rond) c'est pas trop dur pour les images ;)
            • Partager sur Facebook
            • Partager sur Twitter
              10 avril 2006 à 18:10:41

              j'ia commence un snake mais il va me manquer une fonction EnableKeyRepeat pour SDL_KEYUP

              quelqu'un a til une solution ?
              • Partager sur Facebook
              • Partager sur Twitter
                10 avril 2006 à 18:14:59

                idées de jeux :
                space invaders
                Dr mario
                mario bros
                • Partager sur Facebook
                • Partager sur Twitter
                  10 avril 2006 à 18:22:28

                  El Tonio=> EnableKeyRepeat pour SDL_KEYUP? o_0
                  C'est à dire? Que l'action de lacher une touche se répète? C'est complètement inutil... Lol
                  Tu peux expliquer plus précisemment ce que tu veux faire?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 avril 2006 à 18:39:39

                    j'aimerais que comme dans snake, mon carre avance toutes les x temps (selon le niveau. Et si on appuie sur une touche , cela change la direction amis a la limite c pas genant ca je sais faire

                    en fait il faut qu'il avance tous les x temps depuis le dernier KEYUP

                    EDIT : existe t il aussi un equivalent pour la souris ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 avril 2006 à 18:47:08

                      Fais un SDL_PollEvent à la place de SDL_WaitEvent dans ta boucle while et pis en fonction de si il descend à ce moment, si il monte, où si il va a droite ou a gauche bah tu fais tes incrémentations de postion.x et position.y !
                      Voilà

                      (SDL_PollEvent attend un évènement mais continue quand même s'il n'y en a pas à la différence de WaitEvent qui ne continuera pas sans évènements !)

                      P.S.: Tiens tu m'a donné envie d'en faire un de snake ça a pas l'air trop trop dur c'est bien pour commencer ! ^^
                      • Partager sur Facebook
                      • Partager sur Twitter
                        10 avril 2006 à 18:50:05

                        Il faut utiliser SDL_PollEvent à la place de SDL_WaitEvent pour que ton programme continue même si il n'y a pas d'évennement, mais comme l'a dit M@téo SDL_PollEvent utilise 100% du CPU (enfin tout ce q'il peut prendre il le prend quoi... ^^ ) donc il faut rajouter des pauses pour liberer le CPU entre deux SDL_PollEvent, pour ça il y a les fonctions:
                        • Uint32 SDL_GetTicks(void); qui renvoie le nombre de ms écoulées depuis initialisation de la SDL
                        • void SDL_Delay(Uint32 ms); qui fait une pause de "ms" millisecondes...

                        L'exemple d'utilisation est qu'au début de ta grande boucle tu prends le temps, ensuite tu exécute toutes tes actions, et à la fin si ta boucle a mis moins de temps que la valeur que tu veux (de l'ordre de 10/20 ms) tu patiente pendant le temps qu'il faut pour que ça fasse 10 ou 20 ms, comme ça tu n'auras plus besoin d'évennements pour que ta boucle avance et la programme n'utilisera pas tout le CPU...

                        N'oublie pas de teste si ta boucle a mis moins du temps prévu avant le SDL_Delay parceque je me suis fait avoir, si elle met plus de 20ms à se dérouler, une valeur négative est renvoyée à SDL_Delay et la SDL n'aime pas beaucoup ça...(Ca plante quoi... ^^ )


                        [EDIT:] J'ai failli dire Grilled, heureusement que Pierre89 n'a pas pensé au problème de capacité de CPU, sinon j'aurais encore une fois parlé pour rien... :-°
                        • Partager sur Facebook
                        • Partager sur Twitter
                          10 avril 2006 à 18:53:05

                          Salut,
                          pour ton problème à mon avis tu peux regarder le topic "Ralentissement", il y a une explication sur comment faire "dormir" ton programme un petit peu entre chaque boucle evenmentielle, il suffira donc de le faire dormir de moins en moins pour que ton serpent avance de plus en plus vite (tout ça avec PollEvent et pas WaitEvent...)
                          J'ai déjà une ébauche de solution dans la tête mais je te laisse chercher avec cette piste...
                          bonne continuation
                          • Partager sur Facebook
                          • Partager sur Twitter
                            10 avril 2006 à 18:54:53

                            j'ai pas tout suivi la...

                            tu aurais pas un exemple de code de base, juste pour voir comment tu emploies tes fonctions a l'interieur de poll event ?

                            et faut il que j'active le flag du tmeps dans l'initialisation SDL ?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              10 avril 2006 à 19:03:53

                              /* le haut du code, includes etc... */
                              #define INTERVALLE 20

                              int main(int argc, char* argv[])
                              {
                                  /* declaration de l'écran etc... */
                                  int temps = 0, temps_a_attendre = 0;

                                  while(continuer)
                                  {
                                      temps = SDL_GetTicks(); /* On stocke le temps "actuel" (c'est à dire passé depuis l'initialisation de la SDL) dans "temps" */
                                      SDL_PollEvent(&event);
                                      /* le switch et tes instructions, etc... */
                                      if((temps_a_attendre = INTERVALLE - (SDL_GetTicks() - temps)) > 0) /* On regarde si le temps écoulé est superieur a INTERVALLE et on entre la difference dans temps_a_attendre */
                                          SDL_Delay(temps_a_attendre); /* On attend le temps restant */
                                  } /* On revient au début du while et on reprend un nouveau temps... */
                                  /* SDL_Quit() et les FreeSurface etc... */
                              }



                              Ne pas oublier de tester si temps_a_attendre est supperieur à 0 surtout, pour ne pas faire planter...
                              Je ne suis pas sur à 100% que ça marche parceque j'ai pas le temps de tester mais c'est le principe en tout cas...

                              [EDIT:] Wiiiii, c'est moi qui t'ai grillé, mais surtout là où tu fais une erreur c'est que tu ne teste pas si le temps est positif, or sur un PC lent ça pose beaucoup de problèmes... :-°

                              [RE{G}EDIT:] Après la remarque de vinceh1983, les variables temps et temps_a_attendre devraient être en Uint32 et pas en int effectivement, mais ça marche quand même... ^^
                              • Partager sur Facebook
                              • Partager sur Twitter
                                10 avril 2006 à 19:05:48

                                alors petit exemple... :

                                Uint32 temps;------------------//une petite variable tout en haut...

                                while(continuer)---------------//début de la boucle evenmentielle
                                {
                                temps=SDL_GetTicks();------//là tu récupère le temps avant les calculs
                                SDL_PollEvent(&event);
                                .
                                .-------------------------------- //tous les calculs
                                .

                                SDL_Flip(ecran);
                                temps=SDL_GetTicks()-temps;---//quand tu as tout faire tu note le temps que ça a pris
                                SDL_Delay(30-temps);---//tu fait dormir ton programme pendant 30-le temps d'une boucle en ms par ex
                                }

                                Voilà, après en jouant sur le 30 tu fais varier la vitesse de passage à la boucle suivante donc la vitesse de ton serpent... normalement ça marche...
                                A bientôt
                                EDIT : mince j'ai pas étais assez rapide ! moi si je met la variable temps en int il rale ! mais il marche quand même... et c'est vrai que faire un test c'est plus sûr car je sais pas ce qui se passe si tu demandes à ton programme de dormir pendant un temps négatif !
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  10 avril 2006 à 19:19:14

                                  mais derriere, est ce que je ne vais pas avoir un probleme avec la souris qui va generer les evenemnts ? feut il que je partes du principe que la souris ne genere pas d'evenement ?

                                  en tout cas merci beaucoup ^^
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    10 avril 2006 à 19:21:17

                                    Bah si tu utilise la souris en même temps tu vas te heurter au problème bien connu des "rebonds", ça m'a enervé un moment mais tu peux le feinter avec un booléen qui test si le bouton est enfoncé que tu mets à 1 quand SDL_MOUSEBUTTONDOWN et à 0 quand SDL_MOUSEBUTTONUP... ;)
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      10 avril 2006 à 19:22:36

                                      Citation : Ze Killer-Whale

                                      Bah si tu utilise la souris en même temps tu vas te heurter au problème bien connu des "rebonds", ça m'a enervé un moment mais tu peux le feinter avec un booléen qui test si le bouton est enfoncé que tu mets à 1 quand SDL_MOUSEBUTTONDOWN et à 0 quand SDL_MOUSEBUTTONUP... ;)



                                      merci, c'est ce que je cherchais ;)
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        10 avril 2006 à 19:40:03

                                        Citation : theghost

                                        idées de jeux :
                                        space invaders
                                        Dr mario
                                        mario bros



                                        c'est pas en rapport avec le probléme de El Tonio mais le space invader je l'ai fait pour mon action pro (je suis en BTS). Ca s'appel NeoGradius par ce que le vaisseau est tiré du jeu Gradius apparement. je l'ai trouvé sur un site de sprites.

                                        http://dlarena.free.fr/NeoGradius.zip

                                        le code c'est un peu le bordel et programmé à la barbare mais ca marche presque bien.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          10 avril 2006 à 19:41:52

                                          hum... apparement ton lien est mort... moi j'ai erreur 404...
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            10 avril 2006 à 19:54:44

                                            Derniere question : que renvoie PollEvent si aucun evenement ne se passe ?

                                            Merci beaucoup pour toutes ces reponses ;)
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              10 avril 2006 à 19:56:40

                                              Apparement, un évenement vide, tu peux l'utiliser indéfferement avec l'autre, c'est plus ou moins la meme chose
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                10 avril 2006 à 19:57:12

                                                Je crois qu'elle renvoi 0... Enfin ça je suis absolument pas sur, de toute façon on a jamais à tester si rien ne se passe, parceque si rien ne se passe, aucun des éléments du switch ne sont bon et le programme passe à la suite...
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  10 avril 2006 à 20:11:44

                                                  while (continuer)
                                                      {
                                                          temps = SDL_GetTicks();


                                                          {
                                                              SDL_PollEvent(&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:
                                                                              if(positionCarre.y == 16)
                                                                              {
                                                                                  continuer = 0;
                                                                              }
                                                                              else
                                                                              {
                                                                                  positionCarre.y -=16;
                                                                                  derniereAction = 1;
                                                                              }
                                                                              break;
                                                                          case SDLK_DOWN:

                                                                              if(positionCarre.y == ecran->h - 32)
                                                                              {
                                                                                  continuer = 0;
                                                                              }
                                                                              else
                                                                              {
                                                                                  positionCarre.y +=16;
                                                                                  derniereAction = 2;
                                                                              }
                                                                              break;

                                                                          case SDLK_RIGHT:
                                                                              if(positionCarre.x == ecran->w - 32)
                                                                              {
                                                                                  continuer = 0;
                                                                                  derniereAction = 3;
                                                                              }
                                                                              else
                                                                              {
                                                                                  positionCarre.x +=16;
                                                                              }
                                                                              break;
                                                                          case SDLK_LEFT:
                                                                              if(positionCarre.x == 16)
                                                                              {
                                                                                  continuer = 0;
                                                                              }
                                                                              else
                                                                              {
                                                                                  positionCarre.x -=16;
                                                                                  derniereAction = 4;
                                                                              }


                                                                              break;
                                                                      }

                                                                  if (event.type != SDL_QUIT && event.type != SDL_KEYDOWN && event.type != SDL_KEYUP)
                                                                  {
                                                                      switch (derniereAction)
                                                                          {
                                                                          case 1:
                                                                              positionCarre.y -= 16;
                                                                          break;

                                                                          case 2:
                                                                              positionCarre.y +=16;
                                                                          break;

                                                                          case 3:
                                                                              positionCarre.x +=16;
                                                                          break;

                                                                          case 4:
                                                                              positionCarre.x -=16;
                                                                          break;
                                                                          }
                                                                  }
                                                              }
                                                          }

                                                          SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 200, 200, 200));

                                                          SDL_FillRect(surfaceJeu, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
                                                          SDL_BlitSurface(surfaceJeu, NULL, ecran, &positionSurfaceJeu);

                                                          SDL_BlitSurface(carre, NULL, ecran, &positionCarre);
                                                          SDL_Flip(ecran);






                                                      }


                                                  voici mon code d'evenement sans la gestion du temps pour le moment.

                                                  Ce que je voudrais faire c'est remplacer le "if" par un case, mais je ne peux pas car aucun cas ne correspond. Faut il que je me tappe plein de if else ?
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    10 avril 2006 à 20:53:43

                                                    @nightcyborg : je n'arrive pas a compiler ton jeu
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      10 avril 2006 à 21:44:37

                                                      Citation : nightcyborg

                                                      c'est pas en rapport avec le probléme de El Tonio



                                                      C'est au contraire toi qui est HS ^^ .

                                                      Est-ce-que qlq'un veut que je poste mon code de snake ( ça peut aider... )?
                                                      Sinon, pour le fire (je l'ai fait aussi), vous pouvez trouver les règles dur le site de l'éditeur : Stéphane mitermite je crois...
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        11 avril 2006 à 18:34:49

                                                        Citation : vinceh1983

                                                        hum... apparement ton lien est mort... moi j'ai erreur 404...



                                                        c'est bon c'est réparé.

                                                        Citation : Atapi

                                                        @nightcyborg : je n'arrive pas a compiler ton jeu



                                                        ba deja si le lien marchai pas comment l'a tu eu ? et si tu as vraiment eu mon jeu, je l'ai fais avec DEV-c++ sous Windows. si tu as linux c'est peut-être pour ça. je sais pas.

                                                        Citation : Cédric

                                                        C'est au contraire toi qui est HS ^^ .



                                                        ben non je suis dans le sujet puisque je parle d'un jeu en SDL.^^


                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          11 avril 2006 à 18:47:50


                                                          Citation : theghost

                                                          space invaders
                                                          Dr mario
                                                          mario bros




                                                          Tu m'a piquer l'idée du mario bros. Ca fait déjà un petit bout de temps que j'essais de le faire, pas tout le jeu bien sur mais le mini jeu de mario bros 3 où on peut jouer en mode 2 joueurs quand on appuis comme un bourin sur start pour piquer le tour du 2eme joueur .Il est pas fini, certe mais il a bien avancé.
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter

                                                          Les jeux en SDL

                                                          × 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