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
if(*deplacement == hautdroit) // je pense que vous
} // comprendrez facilement
if(posi.x == 0 )
{
if(*deplacement == basgauche)
if(*deplacement == hautgauche)
}
if(posi.y > 440 )
{
if(*deplacement == basdroit)
if(*deplacement == basgauche)
- deplacement = hautgauche;
}
if(posi.x > 600)
{
if(*deplacement == basgauche)
- deplacement = hautgauche;
if(*deplacement == hautdroit)
- deplacement = hautgauche;
if(*deplacement == basdroit)
}
}
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
16 mai 2010 à 11:29
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.