[c] balles rebondissantes en sdl

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 750 fois - Téléchargée 18 fois

Contenu du snippet

Voici un code que j'ai fait récemment.Mais le code est imcomplet(certaines variable ne sont pas utlisés )
je poste ici pour savoir si mon programme est bien codé.
(enfaite ce son des carrers rebondissants et non des balles je me suis gourer dans le titre)

Source / Exemple :


#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>

enum direction   // enumeration de  variable qui permerttront de connaitre la direction facilement au lieu d'ulitiliser des chiffres
{   // 0          1         2       3       4       5         6       7
    hautgauche, gauche, basgauche, bas, basdroit, droite, hautdroit, haut
};

void bouger(SDL_Surface *ecran, SDL_Surface *carrer, SDL_Rect* Position, int deplacement)  //Fonction qui sert a faire bouger un carrer
{
    static int couleura = 0, couleurb = 255, couleurc = 112; //creation de variable de type static. Ces type iniatilise la variable une sueul fois dans tt le programme
                                                             //meme apres plusieur utilisation de la fonction.
    couleura++;  //changement de couleur
    couleurb--;  //changement de couleur
    couleurc++;  //changement de couleur

    switch(deplacement)              //traitement du déplacement
    {
     case hautgauche:               //si deplacement = 0 (hautgauche)
     Position[0].x--;
     Position[0].y--;
     break;
     case gauche:                   //si deplacement = 1 (gauche)
     Position[0].x--;
     break;
     case basgauche:                //si deplacement = 2 (hautgauche)
     Position[0].x--;
     Position[0].y++;
     break;
     case bas:                      //si deplacement = 3 (bas)
     Position[0].y++;
     break;
     case basdroit:                 //si deplacement = 4 (basdroit)
     Position[0].x++;
     Position[0].y++;
     break;
     case droite:                   //si deplacement = 5 (droite)
     Position[0].x++;
     break;
     case hautdroit:                //si deplacement = 6 (hautdroit)
     Position[0].x++;
     Position[0].y--;
     break;
     case haut:                     //si deplacement = 7 (haut)
     Position[0].y--;
     break;
    }
    SDL_FillRect(carrer, NULL, SDL_MapRGB(ecran->format, couleura, couleurb, couleurc)); //colorisation du carrer
    SDL_BlitSurface(carrer, NULL, ecran, &Position[0]);                                  //le carrer est coller sur la surface

}

int rebond(SDL_Rect posi, int* deplacement)    //fonction permettent de rebondir si elle depace les contour de la fenetre
{

  if(posi.y == 0 )
  {
   if(*deplacement == hautgauche)  // pas besoin d'expliquer

  • deplacement = basgauche;
if(*deplacement == hautdroit) // je pense que vous
  • deplacement = basdroit;
} // comprendrez facilement if(posi.x == 0 ) { if(*deplacement == basgauche)
  • deplacement = basdroit;
if(*deplacement == hautgauche)
  • deplacement = hautdroit;
} if(posi.y > 440 ) { if(*deplacement == basdroit)
  • deplacement = hautdroit;
if(*deplacement == basgauche)
  • deplacement = hautgauche;
} if(posi.x > 600) { if(*deplacement == basgauche)
  • deplacement = hautgauche;
if(*deplacement == hautdroit)
  • deplacement = hautgauche;
if(*deplacement == basdroit)
  • deplacement = basgauche;
} } int main ( int argc, char** argv ) { int deplacement = hautgauche, boucle = 1, deplacement2 = basdroit; // creation de trois variable de type int SDL_Init(SDL_INIT_VIDEO); //démarrage de la SDL SDL_Surface *ecran = NULL, *carrer = NULL, *carrer2 = NULL; //iniatialisation de 3 surfaces SDL_Rect position, position2; //iniatilisation de deux varial de type SDL_Rect qui serviront a position les carrer dans la fenetre SDL_Event event; //creation de l'event position.x = 640/2; //position du carrer a la verticale position.y = 480/2; //position du carrer a l'horizontale position2.x = 640/2; //position du carrer2 a la verticale position2.y = 480/2; //position du carrer2 a l'horizontale ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE); //creation de la surface principale 640*480 carrer = SDL_CreateRGBSurface(SDL_HWSURFACE, 40, 40, 32, 0, 0, 0, 0); //creation de la surface du carrer 40*40 carrer2= SDL_CreateRGBSurface(SDL_HWSURFACE, 40, 40, 32, 0, 0, 0, 0); //creation de la surface du carrer2 40*40 SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); //colorie un carré blanc a l'ecran SDL_WM_SetCaption("Rebond de Carrers a martin !", NULL); //ajout du titre a la fenetre SDL_WM_SetIcon(SDL_LoadBMP("Icon.bmp"), NULL); //ajout d'un icone a la fenetre while(boucle) { rebond(position, &deplacement); // fait rebondir la balle si elle touche les extremités de la fenetre rebond(position2, &deplacement2); // fait rebondir la balle si elle touche les extremités de la fenetre (de la deuxieme balle) SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); //efface de l'ecran la balle precedente bouger(ecran, carrer, &position, deplacement); //la balle 1 est dessinée et est copiée sur la surface principal "ecran" bouger(ecran, carrer2, &position2, deplacement2); //la balle 2 est dessinée et est copiée sur la surface principal "ecran" SDL_Flip(ecran); //mise a jour de l'ecran et affichage des balles SDL_Delay(2); //attente de 2 milli seconde SDL_PollEvent(&event); //attente de l'event, mais si il ne recoit pas l'event la boucle continue, contrairement a "SDL_WaiktEvent" switch(event.type) //traitement de l'event { case SDL_QUIT: //permet de quitter la fenetre si on clic sur la croix boucle = 0; //arret de la boucle si on clic break; case SDL_KEYDOWN: // Permet d'arreter SDL_WaitEvent(&event); // le mouvement des switch(event.type) // deux balles { // en appuyant sur case SDL_KEYUP: // une touche du boucle = 0; // clavier. Le mouve break; // -ment reprendra } // en relachant la boucle = 1; // touche. break; // } } SDL_FreeSurface(carrer); //libération SDL_FreeSurface(carrer2); //des trois SDL_FreeSurface(ecran); //surfaces SDL_Quit(); //quitte la SDL }

Conclusion :


voila j'espère que vous pourrez m'aider a améliorer mon code.
bon comme je peut pas extraire mon projet en .zip tenez : (pour ceux qui on la flemme de compiler mon code)

http://www.megaupload.com/?d=82JCRLSD ou http://rapidshare.com/files/387515877/sdl-17.rar.html

A voir également

Ajouter un commentaire

Commentaire

underprog
Messages postés
19
Date d'inscription
samedi 7 novembre 2009
Statut
Membre
Dernière intervention
16 mai 2010
-
Salut,

tu peux simplifier un peu, dans la fonction rebond :

-------

if(posi.x<0 || posi.x>600 || posi.y<0 || posi.y>400){

switch(*deplacement){

// Traitement

}
}

-------

a+

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.