Partage
  • Partager sur Facebook
  • Partager sur Twitter

gestion du temps

pour un "jeu"

    10 avril 2006 à 11:27:19

    Bien le bonjour :)

    Voici le code de mon futur petit jeu, où le héros doit éviter des cubes apparaissant de manière aléatoire... Je compte rajouter des bonus à prendre pour augmenter le score, etc... (j'attends de savoir gérer les collisions autrement qu'à grand coups de if , else if... ^^

    //directives de préprocesseurs
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <time.h>
    //programme
    int main(int argc, char *argv[])
    {
    //début du programme + variable i
    SDL_Init(SDL_INIT_VIDEO);   
    SDL_WM_SetCaption ("Save The Devil", NULL);
    long i = 0;
    //fenetre de base (background , dimensions, etc..)
    SDL_Surface *fenetre = NULL;
    fenetre = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);   
    SDL_FillRect(fenetre, NULL, SDL_MapRGB(fenetre->format, 170, 0, 28));
    // les ennemis
    SDL_Surface *ennemis[15] = {NULL}
    SDL_Rect positionEnnemis;
    positionEnnemis.x = 0;
    positionEnnemis.y = 0;
    //le heros
    SDL_Rect positionHeros;
    positionHeros.x = 389;
    positionHeros.y = 291;
    SDL_Surface *heros = NULL;
    heros = IMG_Load("devil.gif");
    SDL_BlitSurface (heros, NULL, fenetre, &positionHeros)
    SDL_EnableKeyRepeat (3, 3);
    //boucle événements
    long continuer = 1;
    SDL_Event event;
    while (continuer)
    {
          for (i=0;i<15;i++)
          {
              SDL_Rect positionEnnemis;
              positionEnnemis.x= (rand()%750);
              positionEnnemis.y= (rand()%550);
              ennemis[i] = SDL_CreateRGBSurface (SDL_HWSURFACE, 20, 20, 32, 0, 0, 0, 0);
              SDL_FillRect (ennemis[i], NULL, SDL_MapRGB(fenetre->format, 0, 0, 255));
              SDL_BlitSurface(ennemis[i], NULL, fenetre, &positionEnnemis);
              SDL_Flip(fenetre);
          }
          SDL_PollEvent(&event);
          switch (event.type)
          {
                 case SDL_QUIT:
                      continuer = 0;
                      break;
                 case SDL_KEYDOWN:
                      switch (event.key.keysym.sym)
                      {
                             case SDLK_UP:                           
                                  positionHeros.y-= 5;
                                  break;
                             case SDLK_DOWN:
                                  positionHeros.y+= 5;
                                  break;
                             case SDLK_LEFT:
                                  positionHeros.x-= 5;
                                  break;
                             case SDLK_RIGHT:
                                  positionHeros.x+= 5;
                                  break;
                             case SDLK_ESCAPE:
                                  continuer = 0;     
                                  break;
                            case SDLK_q:
                                  continuer = 0;
                                  break;                         
                             case SDLK_a:
                                  continuer = 0;
                                  break;
                      }
                      break;
                 case SDL_MOUSEMOTION:
                      positionHeros.x = event.motion.x;
                      positionHeros.y = event.motion.y;
                      break;
          }
    SDL_FillRect(fenetre, NULL, SDL_MapRGB(fenetre->format, 170, 0, 28));
    SDL_BlitSurface(heros, NULL, fenetre, &positionHeros);
    SDL_Flip(fenetre);
    }
    //finition programme
    for (i=0;i<15;i++)
    SDL_FreeSurface(ennemis[i]);
    SDL_FreeSurface(heros);
    SDL_Quit();   
    return EXIT_SUCCESS;
    }



    Le problème c'est que les 15 petits cubes changent à chaque fois que la boucle while recommence, c'était ce que je voulais mais ca va beaucoup trop vite...(Ca ressemble à la pub de Canal + autrefois :p )

    Et si je mets un SDL_Delay je ne sais plus bouger le héros et j'ai droit à une magnifique boucle infinie si je le mets à la fin du while, ou à un truc qui sert à rien si je le mets à la fin du for... :(

    Tout ce que je voudrais c'est que la boucle continue tant que le bool est bien égal à un mais avec un rafraichissement de la position des cubes toutes les x secondes... Et que je sache bouger pendant ce temps là évidemment ! ;)

    Merci d'avance :)
    • Partager sur Facebook
    • Partager sur Twitter
      10 avril 2006 à 11:33:06

      Tu dois initialiser la SDL avec le flag SDL_INIT_TIMER en plus.
      Ensuite, à tout instant tu peux appeler SDL_GetTicks (ou qqc du genre) qui te donne le nombre de ms écoulées depuis le lancement du programme.
      Avec ça si tu réfléchis un peu tu dois pouvoir t'en sortir ;)
      • Partager sur Facebook
      • Partager sur Twitter

      If you'd like to join us, read "How do we work at OpenClassrooms"! :)

        10 avril 2006 à 11:44:36

        Ok, et en passant les surfaces étant rectangulaires, c'est un solution potable de gérer les collisions avec un tableau à deux dimensions et un armada de boucles for ? :-° Ou alors je suis à côté de la plaque... o_O

        Je pense à

        for (i=0;i<largeur;i++)
        {
             for(j=0;j<hauteur;j++)
             {
                 if etc....
             }
        }
        • Partager sur Facebook
        • Partager sur Twitter
          10 avril 2006 à 12:19:45

          Y'a de l'idée, à toi de faire des tests, de voir si c'est assez rapide etc ^^
          Je n'ai moi-même pas commencé par faire un truc parfait, personne ne peut t'en demander autant. Par contre j'ai essayé de me débrouiller seul pour voir ce que j'étais capable de faire !
          • Partager sur Facebook
          • Partager sur Twitter

          If you'd like to join us, read "How do we work at OpenClassrooms"! :)

            10 avril 2006 à 12:55:32

            Par contre y a pas besoin du SDL_Flip() dans la première boucle for.
            Ton image risque de clignoter, en plus (pas beau :( )
            • Partager sur Facebook
            • Partager sur Twitter
              10 avril 2006 à 13:00:57

              Euh je viens de faire un test et quand je le sors de la boucle, la seule différence c'est que ca va plus vite et que ca "clignote" plus... Par contre faudrait vraiment avoir de sacrés réflexes pour éviter tous les carrés maintenant :p

              EDIT : Miracle o_O , quand je bouge le héros ca ne rame plus maintenant, un bon point ca ^^
              • Partager sur Facebook
              • Partager sur Twitter
                11 avril 2006 à 12:32:43

                Re :p

                Pour l'instant j'ai fait du 1/2 , j'ai résolu le problème de temps, les carrés changent de position toutes les 2 secondes... Toute de fois il me manque un élément très important pour pouvoir commencer à pauffiner les détails :-°

                Les collisions


                J'ai essayé quelques fois mais je me perds dans mes boucles de for et j'ai droit à pleins d'erreurs avec des variables non initialisées alors qu'elles le sont :o ..

                Donc je m'en vais quérir un peu d'aide once again :p

                Here is the code :

                //directives de préprocesseurs
                #include <stdlib.h>
                #include <stdio.h>
                #include <SDL/SDL.h>
                #include <SDL/SDL_image.h>
                #include <time.h>
                //programme
                int main(int argc, char *argv[])
                {
                //début du programme + variables
                SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);   
                SDL_WM_SetCaption ("Save The Devil", NULL);
                long i = 0;
                long temps = SDL_GetTicks();
                //fenetre de base (background , dimensions, etc..)
                SDL_Surface *fenetre = NULL;
                fenetre = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);   
                SDL_FillRect(fenetre, NULL, SDL_MapRGB(fenetre->format, 170, 0, 28));
                //le heros
                SDL_Rect positionHeros;
                positionHeros.x = 389;
                positionHeros.y = 291;
                SDL_Surface *heros = NULL;
                heros = IMG_Load("devil.gif");
                SDL_BlitSurface (heros, NULL, fenetre, &positionHeros)
                SDL_EnableKeyRepeat (3, 3);
                // les ennemis
                SDL_Surface *ennemis[15] = {NULL}
                //boucle événements
                long continuer = 1;
                SDL_Event event;
                while (continuer)
                {
                      if(SDL_GetTicks() > (temps + 3000))
                      {
                          for (i=0;i<15;i++)
                          {
                                          SDL_Rect positionEnnemis[15];
                                          positionEnnemis[i].x= (rand()%750);
                                          positionEnnemis[i].y= (rand()%550);                         
                          }
                          temps = SDL_GetTicks();
                      }
                      SDL_Flip(fenetre);
                      SDL_PollEvent(&event);
                      switch (event.type)
                      {
                             case SDL_QUIT:
                                  continuer = 0;
                                  break;
                             case SDL_KEYDOWN:
                                  switch (event.key.keysym.sym)
                                  {
                                         case SDLK_UP:                           
                                              positionHeros.y-= 5;
                                              break;
                                         case SDLK_DOWN:
                                              positionHeros.y+= 5;
                                              break;
                                         case SDLK_LEFT:
                                              positionHeros.x-= 5;
                                              break;
                                         case SDLK_RIGHT:
                                              positionHeros.x+= 5;
                                              break;
                                         case SDLK_ESCAPE:
                                              continuer = 0;     
                                              break;
                                        case SDLK_q:
                                              continuer = 0;
                                              break;                         
                                         case SDLK_a:
                                              continuer = 0;
                                              break;
                                  }
                                  break;
                             case SDL_MOUSEMOTION:
                                  positionHeros.x = event.motion.x;
                                  positionHeros.y = event.motion.y;
                                  break;
                      }
                SDL_FillRect(fenetre, NULL, SDL_MapRGB(fenetre->format, 170, 0, 28));
                SDL_BlitSurface(heros, NULL, fenetre, &positionHeros);
                for(i=0;i<15;i++)
                {
                                 SDL_Rect positionEnnemis[15];
                                 ennemis[i] = SDL_CreateRGBSurface (SDL_HWSURFACE, 20, 20, 32, 0, 0, 0, 0);
                                 SDL_FillRect (ennemis[i], NULL, SDL_MapRGB(fenetre->format, 0, 0, 255));         
                                 SDL_BlitSurface(ennemis[i], NULL, fenetre, &positionEnnemis[i]);
                }
                SDL_Flip(fenetre);
                }
                //finition programme
                for (i=0;i<15;i++)
                SDL_FreeSurface(ennemis[i]);
                SDL_FreeSurface(heros);
                SDL_Quit();   
                return EXIT_SUCCESS;
                }


                Alors les problèmes par ordre d'importance :-°

                1) un tout petit petit petit indice sur les collisions serait le bienvenu :-°


                2) à chaque boucle for où il est utilsé, je dois réinitialiser inlassablement mon SDL_Rect positionEnnemis[15] depuis que je l'ai transformé en tableau... Pourquoi ?

                • Partager sur Facebook
                • Partager sur Twitter

                gestion du temps

                × 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