Partage
  • Partager sur Facebook
  • Partager sur Twitter

collision[bis]

trop de boucles

    11 avril 2006 à 22:02:15

    Voulant gérer les collisions dans mon jeu (on doit éviter des "mines" pour ceux que ca intéresse). J'avais trouvé une solution paraissant potable au départ , c'était d'utiliser les for pour avoir toutes les position possibles où collision doit être activé...

    Les variables rentrant en compte :

    SDL_rect positionHeros
    positionHeros.x
    positionHeros.y

    SDL_Surface Ennemis[15]

    SDL_Rect positionEnnemis[i]
    positionEnnemis[i].x
    positionEnnemis[i].y

    + la taille d'une mine c'est à dire 20 sur 20

    De plus il faut rajouter la taille de l'héros qui est de 22 sur 18 car sinon seulement le coin gauche de celui-ci comptera pour les collisions...

    Bah allez savoir pourquoi mais je n'arrive à rien de convenable :-°
    Mettre tout ca dans des boucles de for j'arrive à rien , je me perds dans les i, les j , les k et les l ....

    Voilà le code complet :

    //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;
    }


    J'ai entendu plusieurs fois parler de sprites, est-ce la solution pour les collisions ? Si quelqu'un avait le bon moyen , ou réussi à s'en sortir avec les for, ou encore quelques correction à faire dans mon compte, ca me ferait plaisir une petite réponse :)

    Bonne fin de soirée à vous...

    • Partager sur Facebook
    • Partager sur Twitter
      12 avril 2006 à 8:20:52

      Pour ce qui est des sprites :
      Si tu veut, tu peut aller ici, mais il vaut mieux pour toi que tu ait le cerveau bien accroché ;) ... Ils expliquent pas de manière très explicite :o , mais si tu suit bien tout ce qu'ils disent, tu devrait pouvoir modifier leur approche et créer te créer ainsi un gestionnaire de collision adapté. :)
      Bonne chance !
      • Partager sur Facebook
      • Partager sur Twitter
        12 avril 2006 à 10:27:15

        Merci bien nico :) Oui j'étais déjà tombé dessus et j'avais vite zappé pour voir si y'avait rien de mieux expliqué :-° Enfin quand faut y aller, faut y aller :p
        • Partager sur Facebook
        • Partager sur Twitter

        collision[bis]

        × 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