Pong en sdl

Contenu du snippet

Voila, c'est mon deuxieme petit projet avec la sdl.C'est un pong mais qui a un petit bu,je vous laisse le decouvrir.Il peut aussi servir de base (gestion des touches,affichages....)
le zip est trop gros donc je l'ai mis sur mon site.
http://membres.lycos.fr/jul3838/downloads.php et cliquer sur pong.

Source / Exemple :


#include <stdlib.h>
#include <SDL/sdl.h>
#include <SDL/SDL_TTF.h>
#include <stdio.h>
#include <fmod.h>

/*variables des positions raquettes et balle*/
SDL_Rect rballe={512,380,0,0}; 
SDL_Rect rraquet1={2,350,0,0};
SDL_Rect rraquet2={1000,350,0,0};
SDL_Rect intr;
SDL_Rect fleche={290,600,0,0};
SDL_Rect fin1a,fin2b;

/*variables score et sens balle,debut de l'intro et autres....*/  
int sens1=0, sens2=0, scorep=0, scoreo=0, vit=1,game=1,introdu=1,fini,refini=1;

/*les sons*/
FMUSIC_MODULE *son_mid;

/*pour les booléens*/
typedef enum{false,true}bool;

/* Les fonctions*/
void collision();
void loadimage();
void affiche();
void deplacement();
void score();
void ordinateur();
void joueur();
void jouintro();
void introd();

/*liste des images*/
SDL_Surface *Screen, *firstscreen, *balle, *raquette1, *raquette2,*intro, *flech, *fin1, *fin2;

TTF_Font *font;
/* les events*/
SDL_Event event; 

/* Notre belle fonction main*/
int main(int argc, char *argv[])
{ 
  initialisation(); 
  loadimage();
  introd();
  FMUSIC_PlaySong(son_mid);
  fini=1; /*variables pour le score,defini si continue*/
   
   while(game!=0) /* boucle principale*/
  { 
   ordinateur();   
   joueur();
   collision();
   score();
   deplacement();
   affiche();
  continuer();
   SDL_Flip(Screen);
  } 
    
   FMUSIC_StopSong(son_mid);
   SDL_Quit;   
   return 0;
}

void initialisation() /* petite initialisation de la sdl */
{    FSOUND_Init(44100, 32, 0);
    SDL_Init(SDL_INIT_VIDEO);
    Screen=SDL_SetVideoMode(1024, 768, 32,SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN);
  SDL_ShowCursor(0);
    SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,SDL_DEFAULT_REPEAT_INTERVAL+1);
    SDL_Delay(100);
}

void loadimage()/*charge les images + son*/
{   
    intro=SDL_LoadBMP("intro.bmp");
    flech=SDL_LoadBMP("fleche.bmp");
    balle=SDL_LoadBMP("balle.bmp");
    raquette1=SDL_LoadBMP("raquet1.bmp");
    raquette2=SDL_LoadBMP("raquet2.bmp");
    firstscreen=SDL_LoadBMP("scene.bmp");
    fin1=SDL_LoadBMP("ga1.bmp");
    fin2=SDL_LoadBMP("ga2.bmp");
    SDL_SetColorKey(balle,SDL_SRCCOLORKEY,SDL_MapRGB(balle->format,255,0,0));
    /*pour mettre le fond de la balle transparent donc plus de rouge*/
    
     son_mid=FMUSIC_LoadSong("son_mid.mid"); 
     SDL_Delay(500);
}

void joueur() /* la cest la commande du joueur + Choix du jeu ds l'intro*/
{ 
   

    if (SDL_PollEvent(&event))
     {
       switch(event.type)
        {
                   
        case SDL_KEYDOWN:
            {
             Uint8 *keys = SDL_GetKeyState(NULL);
                if (keys[SDLK_UP]) 
                   {
                   if (introdu!=0)
                   {
                   fleche.y=fleche.y-50; /*je pense que vous l'avez compris*/
                     if(fleche.y<600)
                     fleche.y=600;
                    } 
                     rraquet1.y=rraquet1.y-30;
                       if (rraquet1.y<0)
                      rraquet1.y=0;                   
                    }   
                if (keys[SDLK_DOWN])
                   { 
                   if (introdu!=0)
                   {
                       fleche.y=fleche.y+50; /*je pense que vous l'avez compris*/
                      if(fleche.y>650)
                      fleche.y=650;
                       } 
                       rraquet1.y=rraquet1.y+30;
                       if (rraquet1.y>600)
                        rraquet1.y=600;               
                    }
                    if(keys[SDLK_ESCAPE]) /* quitte proprement la sdl*/
                      { 
                       game=0;
                      introdu=0;
                      refini=0;
                      }
                    if(keys[SDLK_RETURN])  
                    {
                       if(fleche.y==600)  /* depla des fleches pr l'intro*/
                       {
                        game=1;
                        introdu=0;
                       }
                       if(fleche.y==650) /* depla des fleches pr l'intro*/
                       {
                        introdu=0;
                        game=0;
                       }
                       if(fini!=0)  /* la variables qui va permettre de continuer si score>10*/
                       {
                       refini=0;
                       }
                    } 
                }    
              break;
            }  
     }       

} 

void ordinateur() 
{ /* l'ordinateur se deplace selon les coordonnées de la balle*/
    if(rballe.y>rraquet2.y)
    {
        rraquet2.y=rraquet2.y+40;
        if (rraquet2.y>600)
        rraquet2.y=600;
    }
    if(rballe.y<rraquet2.y)
    {
        rraquet2.y=rraquet2.y-40;
        if (rraquet2.y<0)
        rraquet2.y=0;
    }    
   
}

void deplacement()
{/* different sens de la balle*/
    if (sens1==0)
    {   rballe.x=rballe.x-(3*vit); 
                 
     }
     if(sens1==1)
     { 
       rballe.x=rballe.x+(3*vit);
       } 
     if (sens2==0)
     {
     rballe.y=rballe.y-(3*vit);
     }  
    if(sens2==1)
     {
       rballe.y=rballe.y+(3*vit);
      }                     
 }           
 
void collision()
{/*on gere les collisions avec le mur et les raquettes,on change donc le sens de balle*/
    if(rballe.y<=0 && rballe.x>512)
    {vit=vit+1;
        sens2=1;
        sens1=0;
        
    }
    if(rballe.y<=0 && rballe.x<512)
    {vit=vit+1;
    sens1=0;
     sens2=1;
     
     }       
    if(rballe.y>=720 && rballe.x<512)
    {vit=vit+1;
       sens1=1;
       sens2=0 ;
     
    }
    if(rballe.y>=720 && rballe.x>512)
    {vit=vit+1;
     sens2=0;
     sens1=1;
    
    }    /* merci ptival de m'avoir aidé sur les collisions balle/raquettes */
    if((rballe.x + rballe.w) >= rraquet1.x
&&
(rballe.x) <= (rraquet1.x + rraquet1.w)
&&
(rballe.y + rballe.h) >= rraquet1.y
&&
(rballe.y) <= (rraquet1.y + rraquet1.h)
)
    {vit=vit+1;
        sens1=1 ;
        
       
    }
    if((rballe.x + rballe.w) >= rraquet2.x
&&
(rballe.x) <= (rraquet2.x + rraquet2.w)
&&
(rballe.y + rballe.h) >= rraquet2.y
&&
(rballe.y) <= (rraquet2.y + rraquet2.h)) 
    {vit=vit+1;
    sens1=0;
      sens2=0; 
       
       
     }
    
}
void score()
{
    if (rballe.x<=0) /*si le joueur ne rattrape pas la balle on remet a O*/
    {
    scoreo=scoreo+1;
    
    rballe.y=380;
    rballe.x=512;
    vit=1;
    sens1=0;
    sens2=0;
    }    
    if(rballe.x>=1024) /*si l'ordi ne ratttrape pas la balle*/
    {
    scorep=scorep+1;
    rballe.y=380;
    rballe.x=512;
    vit=1;
    sens1=1;
    sens2=1;
    } 
    
    
}

void affiche()
{/*réaffiche les positions*/
          SDL_BlitSurface(firstscreen,NULL,Screen,NULL);   
          SDL_BlitSurface(balle,NULL,Screen,&rballe);
          SDL_BlitSurface(raquette1,NULL,Screen,&rraquet1);
          SDL_BlitSurface(raquette2,NULL,Screen,&rraquet2);
}       
 

 void introd() /* l'intro.....*/
 {
 while(introdu!=0)
 {
 
 joueur();

 SDL_BlitSurface(intro,NULL,Screen,&intr); 
 SDL_BlitSurface(flech,NULL,Screen,&fleche); 
 SDL_Flip(Screen);
 } 
 } 
 
 void continuer()
 { 
    if(scoreo>9)
    {
    while (refini!=0)
    {
    joueur(); 
    SDL_BlitSurface(fin1,NULL,Screen,&fin1a);
    SDL_Flip(Screen);
     }
    rballe.x=512;
    rballe.y=380;
    rraquet1.x=2;
    rraquet1.y=350;
    rraquet2.x=1000;
    rraquet2.y=350;
    sens1=1;
    sens2=1;
    scoreo=0;
    scorep=0;
    vit=1;
    refini=1;
    SDL_Delay(50);
    }
    if(scorep>9)
    {
    while (refini!=0)
    {
    joueur(); 
    SDL_BlitSurface(fin2,NULL,Screen,&fin2b);
    SDL_Flip(Screen);
     }
    rballe.x=512;
    rballe.y=380;
    rraquet1.x=2;
    rraquet1.y=350;
    rraquet2.x=1000;
    rraquet2.y=350;
    sens1=1;
    sens2=1;
    scoreo=0;
    scorep=0;
    vit=1;
    refini=1;
    SDL_Delay(50);
    }
}

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.