Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] Un petit pong

et le rebond de cette balle

Anonyme
    14 janvier 2006 à 21:28:45

    Bonjour
    Je "m'amuse" a realiser un petit pong en C avec SDL.Le mouvement des raquetes est moyen mais marche assez pour jouer .Mais c'est le rebond de la balle ou la je n'y arrive pas .
    Jai essayer des trucs du style :

    if(position>550)
    {
    vitesse=-3;
    }

    Mais ca ne marche pas .Au mieux la balle se bloque et reste a moitie sur place mais ne rebondis pas .
    Voila mon code :

    // Le header pour SDL
    #include <SDL.h>
    //on inclue le fichier h qui contient le prototype des fonction

    #include "main.h"

    SDL_Rect rect1; // Source de la raquette 1

    SDL_Rect rect2; // Source de la raquette 2

    SDL_Rect rect_balle; // Source de la balle

    SDL_Event event; // gestion des evenement

    //on defini une surface Screen , raquete1, raquette2,fond et balle.             
    SDL_Surface * Screen;         
    SDL_Surface * raquete1;
    SDL_Surface * raquete2;
    SDL_Surface * balle;
    //SDL_Surface * fond;

    int main(int argc, char *argv[])                     
    {
    //on defini les varaiables score1, score2, gagant difference
    int score1;
    int score2;
    int gagnant;
    int difference;
    int bol;

    //on defini la vittese en x et y de la balle
    float sx_balle;
    float sy_balle;

    //vitesse en x et y de la balle
    /*sx_balle=-1;
    sy_balle=0;*/


    //on definni le score du joueur 1 et  2, le gagant ,la difference , et la variable bol
     score1=0;
     score2=0;
     gagnant=0;
     difference=0;
     bol=1;
      //defini la vitesse de la balle en x et y
    sx_balle+=3;
    sy_balle+=0;
     
        //initialisation de SDL
        initialiser();
           
            //on defini la position depart de la balle
            rect_balle.x=260;
        rect_balle.y=260;
        rect_balle.w=10;
        rect_balle.h=10;
           
            //on defini la position depart de la raquette1
            rect1.x=25;
        rect1.y=260;
        rect1.w=50;
        rect1.h=50;
           
            //on defini la position depart de la raquette2
            rect2.x=550;
        rect2.y=260;
        rect2.w=50;
        rect2.h=50;
           
            /*
        //on defini la position du fond .Desactive pour le moment
            fond1.x=0;
        fond1.y=0;
        fond1.w=800;
        fond1.h=600;
        */

           
           
            //on charge les sprites
            //fond = SDL_LoadBMP("fond.bmp";);
            raquete1 = SDL_LoadBMP("raquete1.bmp");
            raquete2 = SDL_LoadBMP("raquete2.bmp");
            balle = SDL_LoadBMP("balle.bmp");
           
           
            //on test si ils sont bien charger.Desactive pour le moment
            /*   if ( fond == NULL )
       {
            fprintf(stderr, "Impossible de charger %s: %s\n", fond, SDL_GetError());
            return;
        }
    */
         
                       if ( raquete1 == NULL )
       {
            fprintf(stderr, "Impossible de charger %s: %s\n", raquete1, SDL_GetError());
            return;
        }
           
                       if ( raquete2 == NULL )
       {
            fprintf(stderr, "Impossible de charger %s: %s\n", raquete2, SDL_GetError());
            return;
        }
           
                       if ( balle == NULL )
       {
            fprintf(stderr, "Impossible de charger %s: %s\n", balle, SDL_GetError());
            return;
        }
             
             //tous les chargement sa sont bien passe
             
     //colorkey pour enlever le fond des images et eviter un  beau gros cadre autours
    SDL_SetColorKey(balle,SDL_SRCCOLORKEY,SDL_MapRGB(balle->format,255,0,255) );
    SDL_SetColorKey(raquete1,SDL_SRCCOLORKEY,SDL_MapRGB(raquete1->format,255,0,255) );
    SDL_SetColorKey(raquete2,SDL_SRCCOLORKEY,SDL_MapRGB(raquete2->format,255,0,255) );

    //SDL_SetAlpha pour un peu de transparence
    SDL_SetAlpha(balle,SDL_SRCALPHA,128);   
    SDL_SetAlpha(raquete1,SDL_SRCALPHA,255);
    SDL_SetAlpha(raquete2,SDL_SRCALPHA,255);

    //on affiche
    affichage();


    //pointeur sur la vitesse x de la balle
    float *p_sx_balle;
    p_sx_balle=&sx_balle;

    //debut de la gestion de la boucle devenement
      while(score1 != 11 || score2 != 11 && difference >= 2 )//while "test score"
      {
      while(bol==1) // Boucle infinie
      {

    //on fait avancer la balle
    avancer_balle(sx_balle, sy_balle, score1, score2, difference, p_sx_balle);
     
      // Traitement des commandes
      while(SDL_PollEvent(&event))
      {
        // Type d'évènement
        switch(event.type)
        {
          case SDL_KEYDOWN:
            // Si on presse une touche
            switch(event.key.keysym.sym)
            {             
                            case SDLK_a:
                            // touche joueur 1 haut */
                            j1_haut ();
                            break;
                           
                            case SDLK_q:
                            // touche joueur 1 bas
                            j1_bas();
                            break;
                           
                            case SDLK_o:
                            // touche joueur 2 haut
                            j2_bas();
                            break;
                           
                            case SDLK_l:
                            // touche joueur 2 bas
                            j2_haut();
                            break;
                           
                              case SDLK_ESCAPE:
                              //touche escapeOn quite
                  quiter();
                  break;
     
                 
                  case SDLK_RETURN:
                              //touche entrer.On quite
                  quiter();
                  break;

                default:
                break;
             }//fin de switch touche
             

          default:
          break;
        }//fin du switch type evenement
       
        }//fin de la boucle evenement
       
       }//fin de la boucle infini

       }//fin du while est score

    //je met ca pour quiter dans tous les cas ou le type arriverai a sortir de la boucle.
    quiter();

    //return de fin
    return 0;
    } //fin de main

    //fonction qui initialise SDL
    int initialiser(void)
    {   
       // Initialisation de SDL
       if (SDL_Init (SDL_INIT_VIDEO) < 0)
       {
       fprintf (stderr, "Erreur d'initialisation de SDL: %s\n",
       SDL_GetError ());
       return 1;
       }
       
       atexit (SDL_Quit); // Pour quitter proprement
        //on defini Screen
        Screen = SDL_SetVideoMode (800, 600, 16, SDL_SWSURFACE|SDL_DOUBLEBUF);
        SDL_ShowCursor(0);   
           
           //si Screen foire
          if (Screen == NULL)
          {
          fprintf (stderr, "Erreur d'initilaisation du mode video: %s\n",
          SDL_GetError ());
          return 2;
          }
       
    }

    //fonction pour quiter SDL
    int quiter(void)
    {
        SDL_FreeSurface(Screen);
        SDL_ShowCursor(1);
        SDL_Quit();
        exit(0);
            return 0;
    }



    /*
    ** Pour les mouvement si
    ** p_raquete1=1; sa va a en haut
    ** p_raquete1=-1; sa va a en bas
    **meme principe pour raquete 2
    */

        //touche a
        int j1_haut(void)
        {
        int sx1=1;
        rect1.y+=10*sx1;

    //on affiche
        affichage();

         return 0 ;
         }

    //touche q
    int j1_bas(void)
    {
    int sx1=-1;
    rect1.y+=10*sx1;

    //on affiche
    affichage();
           
     return 0 ;
    }

        //touche o
        int j2_haut(void)
        {
        int sx1=1;
        rect2.y+=10*sx1;

    //on affiche
        affichage();
           
         return 0 ;
         }

    //touche l
    int j2_bas(void)
    {
    int sx1=-1;
    rect2.y+=10*sx1;


    //on affiche
    affichage();
           
     return 0 ;
    }

    //fonction pour afficher
    int affichage(void)
    {
    /*
    //on copie le sprite.desactiver pour le moment
    SDL_BlitSurface(fond, NULL, Screen, &fond1);         
    //on blit
    SDL_Flip(Screen);
    */



    //on copie le sprite
    SDL_BlitSurface(balle, NULL, Screen, &rect_balle);   
    //on blit
    SDL_Flip(Screen);

    //on copie le sprite
    SDL_BlitSurface(raquete1, NULL, Screen, &rect1);     
    //on blit
    SDL_Flip(Screen);

    //on copie le sprite
    SDL_BlitSurface(raquete2, NULL, Screen, &rect2);     
    //on blit
    SDL_Flip(Screen);

    SDL_FillRect(Screen, NULL, 0);

    return 0;
    }

    int avancer_balle(float sx_balle, float sy_balle, int score1, int score2, int difference, float *p_sx_balle)
    {

    //calcule les nouvelles coordone(2 fois la vitesse )
    rect_balle.x+=2*sx_balle;
    rect_balle.y+=2*sy_balle;

    //on affiche
    affichage();

    //si la position > 551 pixels
    if(rect_balle.x>551)
    {
    p_sx_balle=0;
    //sy_balle=0;
    }
    affichage();
    return 0;
    }



    et mon fichier main.h

    int initialiser(void);
    int quiter(void);

    int j1_bas(void);
    int j2_bas(void);

    int j1_haut(void);
    int j2_haut(void);

    int affichage(void);
    int avancer_balle(float sx_balle, float sy_balle, int score1, int score2, int difference, float *p_sx_balle);



    Si quelqun peut maider a faire rebondir une balle .Merci
    [EDIT]:Si quelqu'un sait comment faire pour que mes raquettes monte si l'on reste appuye sur une touche(a,q,o,l) je suis preneur car la on est obliger d'appuyer plein de fois sucesivement et c'est enervant .Merci
    • Partager sur Facebook
    • Partager sur Twitter
      14 janvier 2006 à 21:46:13

      je pense que si quelqu'un peut t'aider il fait parti d'une faible parti des gens de ce forum enfin je pense car nous sommes entrain d'apprendre les bases (enfin moi en tout cas).

      Bonne chance :)
      • Partager sur Facebook
      • Partager sur Twitter
        15 janvier 2006 à 1:30:32

        pour faire rebondir la balle, tu as une variable qui si elle est à 1 tu fais :
        vitesse +=3
        si elle est à zéro :
        vitesse -=3
        et donc quand la balle arrive au bord tu change l'état de la variable.
        • Partager sur Facebook
        • Partager sur Twitter
          15 janvier 2006 à 8:55:40

          Moi, je mettrais plutot en variable les composantes (selon x et y) du mouvement. Quand la balle arrive contre un mur vertical tu inverses la composante x, et sur un mur horizontal tu inverses la composante y.
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            15 janvier 2006 à 11:20:35

            Merci je vais essayer tout ca et vous dire si ca marche .
            Edit : J ai trouve un truc en m'inspirant de vos reponces .Le voila

            int avancer_balle( int score1, int score2, int difference)
            {
            //on defeni la variable vitesse  en x ainsi que sa valeur
            float sx_balle;
            sx_balle=2;

            //on defeni la variable vitesse  en y ainsi que sa valeur
            float sy_balle;
            sy_balle=0;

                    while(1)//boucle infini pourles controle
                    {

                    //si la position > 551 pixels (si il ya point pour J1)
                    if(rect_balle.x>560)
                    {
                    sx_balle=-3;
                    score1++;
                    rect_balle.x=260;
                    rect_balle.y=260;
                    }
                           
                    //si la position <20 pixels (si il ya point pour J2)
                    if(rect_balle.x<20)
                    {
                    sx_balle=3;
                    score2++;
                    rect_balle.x=260;
                    rect_balle.y=260;
                    }
                    //si la balle cogne  le "mur" du haut
                    if(rect_balle.y>550)
                    {
                    sy_balle=-3;
                    }       
                           
                    //si elle cogne le "mur" du bas
                    if(rect_balle.y<20)
                    {
                    sy_balle=3;
                    }
                   
                    //sil elle cogne la raquete1

                            if(rect_balle.y==rect1.y)
                            {
                            sx_balle=3;
                            sy_balle=2;
                            }
                   
                            if(rect_balle.y==rect2.y)
                            {
                            sx_balle=-3;
                            sy_balle=-2;
                            }
                    //calcule les nouvelles coordone(2 fois la vitesse )
                    rect_balle.x+=2*sx_balle;
                    rect_balle.y+=2*sy_balle;
                   
                    //on permet le controle
                    controle();
                   
                    //on affiche
                    affichage();

            }

            return 0;
            }

            Mais maintenant ca foire au niveau des collision raquete/balles et sur tout au niveau de la position en x car des collisions juste avec y marche .Pour info La position est defini par rapport a quel pixel de limage (en haut a gauche , au milieu des diagonale ..)
            Merci d'avance
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              16 janvier 2006 à 13:02:12

              personne ne sait pour mon Edit ?
              • Partager sur Facebook
              • Partager sur Twitter
                16 janvier 2006 à 22:18:50

                C'est pas marqué dans la doc SDL ?
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  17 janvier 2006 à 17:01:44

                  Si ca l'ai j'ai rien vue car j'ai foullier de tous les cotés mais je crois que je vais m'y replonger . Sinon toujours personne pour ces colision avec x en plus ???
                  • Partager sur Facebook
                  • Partager sur Twitter

                  [SDL] Un petit 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