Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL]Casse Brique

vos critiques sur le code te le jeux...

    14 avril 2006 à 20:40:06

    Salut les zér0



    Enfin, grâce à M@téo tout puissant, ;) j'ai créé mon premier jeux SDL, oui je sais, rien d'exptionnel: un Casse Brique... :D

    J'aimerais avoir vos avis sur le code source et sur le jeux:

    Télécharger ici. " CasseBrique.zip "

    Quelques commandes:


    • FLECHE HAUT, pour augmenter la vitesse de la balle
    • FLECHE BAS, pour diminuer la vitesse de la balle
    • ESPACE, pour initialiser la vitesse de la balle


    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL\SDL.h>
    // Dimenssion de la fenêtre
    #define LARGEUR_ECRAN 300
    #define HAUTEUR_ECRAN 400
    #define BITS_PAR_PIXEL 32
    // Dimenssion de la barre de rebond
    #define LARGEUR_BARRE 50
    #define HAUTEUR_BARRE 8
    #define POSITION_BARRE_Y 380
    // Initialisation de la balle
    #define VITESSE_BALLE_INIT 30
    // Nombre de ligne(s) et de colone(s) pour les briques
    #define NBR_LIGNE 15
    #define NBR_COLONE 5
    #define ESPACE_BRIQUE_C 60
    #define ESPACE_BRIQUE_L 15
    #define MARGE_BRIQUE_C 4
    #define MARGE_BRIQUE_L 4

    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL, *start = NULL, *ball = NULL, *rectangle = NULL, *brique = NULL, *win = NULL, *loose = NULL;
        SDL_Rect positionBall, positionStart, positionRectangle, positionBrique, positionWin, positionLoose;
        SDL_Event event;
        int continuer = 1, vitesse = VITESSE_BALLE_INIT, deplacementX = 1, deplacementY = -1, l = 0, c = 0, i = 0;
        long brique_tab[NBR_LIGNE*NBR_COLONE]={0};
       
       
        SDL_Init(SDL_INIT_VIDEO);
       
        SDL_ShowCursor(SDL_DISABLE);

        SDL_WM_SetIcon(SDL_LoadBMP("ball2.bmp"), NULL);

        ecran = SDL_SetVideoMode(LARGEUR_ECRAN, HAUTEUR_ECRAN, BITS_PAR_PIXEL, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN); /* Double Buffering */
        SDL_WM_SetCaption("Casse brique", NULL);

        rectangle = SDL_CreateRGBSurface(SDL_HWSURFACE, LARGEUR_BARRE, HAUTEUR_BARRE, BITS_PAR_PIXEL, 0, 0, 0, 0);

        ball = SDL_LoadBMP("ball2.bmp");
        SDL_SetColorKey(ball, SDL_SRCCOLORKEY, SDL_MapRGB(ball->format, 255, 255, 255));

        positionBall.x = ecran->w / 2 - ball->w / 2;
        positionBall.y = POSITION_BARRE_Y - ball->h;
       
        brique = SDL_LoadBMP("brique.bmp");
        SDL_SetColorKey(brique, SDL_SRCCOLORKEY, SDL_MapRGB(brique->format, 255, 0, 0));
       
        positionRectangle.x= ecran->w / 2 - rectangle->w / 2;
        positionRectangle.y = POSITION_BARRE_Y;
       
        win = SDL_LoadBMP("win.bmp");
        positionWin.x= ecran->w / 2 - win->w / 2;
        positionWin.y= ecran->h / 2 - win->h / 2;
        loose = SDL_LoadBMP("loose.bmp");
        positionLoose.x= ecran->w / 2 - loose->w / 2;
        positionLoose.y= ecran->h / 2 - loose->h / 2;
        start = SDL_LoadBMP("start.bmp");
        SDL_SetColorKey(start, SDL_SRCCOLORKEY, SDL_MapRGB(start->format, 255, 255, 255));
        positionStart.x= ecran->w / 2 - start->w / 2;
        positionStart.y= NBR_LIGNE*(brique->h + MARGE_BRIQUE_L);
           
        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_RETURN:
                             continuer = 0;
                            break;
                    }
                    break;
                case SDL_MOUSEBUTTONUP:
                     if(event.button.button == SDL_BUTTON_LEFT)
                     {
                      continuer=0;
                      }
                    break;
                case SDL_MOUSEMOTION:
                     if(event.motion.x > LARGEUR_ECRAN-LARGEUR_BARRE)
                     {
                      positionRectangle.x = LARGEUR_ECRAN-LARGEUR_BARRE;
                      positionBall.x = LARGEUR_ECRAN-LARGEUR_BARRE + (LARGEUR_BARRE/2) - (ball->w/2);
                     }                     
                     else
                     {
                      positionRectangle.x = event.motion.x;
                      positionBall.x = event.motion.x + (LARGEUR_BARRE/2) - (ball->w/2);
                     }
                    break;               
            }
           
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
            SDL_FillRect(rectangle, NULL, SDL_MapRGB(rectangle->format, 0, 64, 128));
            SDL_BlitSurface(rectangle, NULL, ecran, &positionRectangle);
            SDL_BlitSurface(ball, NULL, ecran, &positionBall);
            SDL_BlitSurface(start, NULL, ecran, &positionStart);
           
            i=0;
            for(l=0; l<NBR_LIGNE; l++)
            {       
              for(c=0; c<NBR_COLONE; c++)
              {
                positionBrique.x = (c*ESPACE_BRIQUE_C)+MARGE_BRIQUE_C;
                positionBrique.y = (l*ESPACE_BRIQUE_L)+MARGE_BRIQUE_L;
                if(brique_tab[i]==0)
                {
                 SDL_BlitSurface(brique, NULL, ecran, &positionBrique);
                }
                i++;
              }
            }
           
            SDL_Flip(ecran);
        }

        continuer=1;

        // On contrôle les touches clavier et la souris

        while (continuer)
        {
            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(vitesse < 6000)
                             {
                             vitesse++;
                             }
                            break;
                        case SDLK_DOWN:
                             if(vitesse > 1)
                             {
                             vitesse--;
                             }
                            break;
                        case SDLK_SPACE:
                             vitesse = VITESSE_BALLE_INIT;
                            break;
                    }
                    break;     
                case SDL_MOUSEMOTION:
                     if(event.motion.x > LARGEUR_ECRAN-LARGEUR_BARRE)
                     {
                      positionRectangle.x = LARGEUR_ECRAN-LARGEUR_BARRE;
                     }                     
                     else
                     {
                      positionRectangle.x = event.motion.x;
                     }
                    break;
                     
            }
            //*****************************
           
            // Détection du rebond sur les parois de la fenêtre
           
            if((positionBall.x <= 0) || (positionBall.x >= ecran->w - ball->w))
            {
             deplacementX = (-1)*deplacementX;
             deplacementY = deplacementY;
            }
            if((positionBall.y <= 0))
            {
             deplacementX = deplacementX;
             deplacementY = (-1)*deplacementY;
            }
            if(((positionBall.y + ball->h) > positionRectangle.y) && (positionBall.y < (positionRectangle.y+HAUTEUR_BARRE)))
            {
                if(((positionBall.x + ball->w) < (positionRectangle.x+LARGEUR_BARRE)) && (positionBall.x > positionRectangle.x) && (deplacementY > 0))
                {
                 deplacementX = deplacementX;
                 deplacementY = (-1)*deplacementY;
                }
            }
            //*****************************
                   
            // Détection des briques cassés
            i=0;
            for(l=0; l<NBR_LIGNE; l++)
            {       
              for(c=0; c<NBR_COLONE; c++)
              {
                positionBrique.x = (c*ESPACE_BRIQUE_C)+MARGE_BRIQUE_C;
                positionBrique.y = (l*ESPACE_BRIQUE_L)+MARGE_BRIQUE_L;
                if(brique_tab[i]==0)
                {
                   if((positionBall.y > positionBrique.y) && (positionBall.y < (positionBrique.y+brique->h)))
                   {
                      if((positionBall.x > positionBrique.x) && (positionBall.x < (positionBrique.x+brique->w)))
                      {
                       brique_tab[i]=1;
                       deplacementY = (-1)*deplacementY;
                      }
                   }
                }
                i++;
              }
            }
            //*****************************
           
           
            // On recalcul les coordonnées de la balle
           
            positionBall.x = positionBall.x+((vitesse/10)*deplacementX);
            positionBall.y = positionBall.y+((vitesse/10)*deplacementY);
            //*****************************

       // On génère l'affichage
       
       int total=0;
       for(i=0; i<(NBR_LIGNE*NBR_COLONE);i++)
       {
         total = total+brique_tab[i];
       }
       
       if(positionBall.y > HAUTEUR_ECRAN)
       {
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
            SDL_BlitSurface(loose, NULL, ecran, &positionLoose);
            SDL_FillRect(rectangle, NULL, SDL_MapRGB(rectangle->format, 0, 64, 128));
            SDL_BlitSurface(rectangle, NULL, ecran, &positionRectangle);
           
            SDL_Flip(ecran);
           
            continuer=0;
       }
       else if(total == NBR_LIGNE*NBR_COLONE)
       {
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
            SDL_BlitSurface(win, NULL, ecran, &positionWin);
            SDL_FillRect(rectangle, NULL, SDL_MapRGB(rectangle->format, 0, 64, 128));
            SDL_BlitSurface(rectangle, NULL, ecran, &positionRectangle);
                   
            SDL_Flip(ecran);
           
            continuer=0;
       }
       else
       {                       
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
           
            i=0;
            for(l=0; l<NBR_LIGNE; l++)
            {       
              for(c=0; c<NBR_COLONE; c++)
              {
                positionBrique.x = (c*ESPACE_BRIQUE_C)+MARGE_BRIQUE_C;
                positionBrique.y = (l*ESPACE_BRIQUE_L)+MARGE_BRIQUE_L;
                if(brique_tab[i]==0)
                {
                 SDL_BlitSurface(brique, NULL, ecran, &positionBrique);
                }
                i++;
              }
            }

            SDL_BlitSurface(ball, NULL, ecran, &positionBall);
            SDL_FillRect(rectangle, NULL, SDL_MapRGB(rectangle->format, 0, 64, 128));
            SDL_BlitSurface(rectangle, NULL, ecran, &positionRectangle);
           
            SDL_Flip(ecran);
        }
            //*****************************
           
        } // Fin de la boucle infinie
       
        continuer=1;
        SDL_ShowCursor(SDL_ENABLE);
       
        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE:
                             continuer = 0;
                            break;
                    }
                    break;               
            }
        }

        SDL_FreeSurface(ball);
        SDL_FreeSurface(start);
        SDL_FreeSurface(win);
        SDL_FreeSurface(loose);
        SDL_FreeSurface(rectangle);
        SDL_FreeSurface(brique);
        SDL_FreeSurface(ecran);
        SDL_Quit();

        return EXIT_SUCCESS;
    }
    • Partager sur Facebook
    • Partager sur Twitter
      14 avril 2006 à 21:01:00

      Tout dans le main ? :o

      Si tu veux un premier avis, le voici : tout dans le main, ça fait peut-être un peu beaucoup. Tu devrais commencer à prendre l'habitude à créer des fonctions :p
      • Partager sur Facebook
      • Partager sur Twitter

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

        14 avril 2006 à 21:30:31

        c'est amusant.
        maintenant faut l'améliorer .
        dans un premier temps tu devrais réaliser :
        - un score
        - un nombre de vies qui augmente tout les x points du score et qui diminue quand on perd la balle . Game Over à 0 vie bien sur ...
        - des niveaux
        - une variété de briques ( résistantes à x coups )
        - des bonus ( ralentissement de la balle, agrandissement de la barre, balle qui transperce les briques au lieu de rebondir dessus, balle qui colle à la barre ,etc ... )
        - un rebondissement de la balle en fonction de la position sur la barre ( si sur extremité droite, va très à droite, si sur le milieu, va tout droit, etc )
        - un espace entre le plafond et les briques du haut
        - une image de fond
        - des bruitages

        avec tout ca tu peux avoir un vrai jeu interressant.

        j'ai bien aimé :
        - les graphismes, simples mais pratiques. je veux dire, c'est pas un fouilli incompréhensible
        - le fait que les briques soit espacées et non pas collées, la balle peut donc s'enfoncer dans le mur grace aux petites failles, c'est amusant

        • Partager sur Facebook
        • Partager sur Twitter
          14 avril 2006 à 22:00:27

          Le problème c'est que je n'arrive pas à créer une fonction qui blit des images !!! o_O

          Comment faire ??? ^^
          • Partager sur Facebook
          • Partager sur Twitter
            14 avril 2006 à 22:02:54

            tu passe en parametre tes surface dans une fonction, et tu les blit non? o_O
            • Partager sur Facebook
            • Partager sur Twitter
              14 avril 2006 à 22:06:18

              Oui mais les fonctions:

              SDL_Surface;
              SDL_Rect;
              SDL_CreateRGBSurface();
              SDL_LoadBMP();


              Je dois les mettre dans la fonction ou dans le main ??? :(
              • Partager sur Facebook
              • Partager sur Twitter
                14 avril 2006 à 22:09:30

                SDL_Surface et SDL_Rect tu peut les mettre dans le main autant que tu les passe a ta fonction, ce qui est des 2 autres, tu peut les mettre une fois quand tu déclare tes surface, puisque les donnée vont directement sur la surface, tu na plus besoin des fonction. ;)
                • Partager sur Facebook
                • Partager sur Twitter
                  14 avril 2006 à 22:20:44

                  si c'est pour faire des fonctions sans argument, vaut mieux faire des defines de fonctions qui prennent chacunes un bout de code particulier puis tu les classes . Ensuite en incluant les headers tu pourras utiliser les fonctions dans le main et le compilateur viendra remplacer les appels par le code de tes fonctions .

                  par exemple une fonction initialisationSDL(), dedans tu mets les codes pour lancer SDL, choisir l'icone, le titre de la fenetre, etc ...


                  ca te permet d'avoir exactement le même code mais en propre et classé.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  [SDL]Casse Brique

                  × 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