1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
| ///=============================================================================
/*
generation_goute.c
-génération aléatoire d'une certaine quantité de gouttes
-génération aléatoire des coordonnées de toutes ces gouttes
-affichage des gouttes + simulation de pluie
-retournement à main.c des coordonnées de toutes les goutes dans un tableau de structure de coordonnées
*/
#include "generation_goute.h"
///=============================================================================
///=============================================================================
///DEBUT PLUIE
//Effet de pluie
void pluie (SDL_Surface *fenetre, const long hauteur_fenetre, const long intensite_min, const long intensite_max, unsigned char couleur_goutte1, unsigned char couleur_goutte2, unsigned char couleur_goutte3, long longueur_min_goutte, long longueur_max_goutte, long largeur_goutte, float fvitesse1, float fvitesse2)
{
//Coordonnées aléatoires des goutes de pluie en X
int i, j;
srand(time(NULL)); //Initialisation du générateur
unsigned long nbr_goutte = 0; //Nombre de goutes à l'écran
nbr_goutte = nbr_aleatoire(intensite_min, intensite_max); /*Génération d'un nombre aléatoire entre 1 et intensite
et qui va représenter le nombre de goutes de pluie à l'écran*/
unsigned long Coord_Goutte_X[nbr_goutte];//Tableau des coordonnées de toutes les goutes pour l'axe des abcisses
unsigned long Coord_Goutte_Y[nbr_goutte];//Tableau des coordonnées de toutes les goutes pour l'axe des ordonnés
for (i=1; i<nbr_goutte; i++)
{
Coord_Goutte_X[i] = nbr_aleatoire(1, 800);
Coord_Goutte_Y[i] = nbr_aleatoire(1, 600);
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
//Création des tableaux + allocation de la mémoire
SDL_Surface ** goutte = NULL;//Pointeur de surface qui va servir de tableau de surfaces
goutte = malloc(nbr_goutte * sizeof(* goutte));//Allocation de la mémoire pour le tableau du nombre de gouttes aléatoire
if (goutte == NULL)
exit(0);
for(i = 1; i<nbr_goutte; i++)
goutte[i] = SDL_CreateRGBSurface(SDL_HWSURFACE, largeur_goutte, nbr_aleatoire(longueur_min_goutte, longueur_max_goutte), 32, 0, 0, 0, 0);
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
//Boucle principale
unsigned char Continuer = 1;
SDL_Event event;
SDL_Rect coord_goutte; //Coordonnées de la goutte qui va être dessinée
int temps_actuel = 0, temps_precedent = 0;
SDL_Rect coord_image_de_fond;
coord_image_de_fond.x = 0;
coord_image_de_fond.y = 0;
SDL_Surface *image_de_fond = IMG_Load("IMAGES/sunlake.jpg");
//Répétition des touches activées
SDL_EnableKeyRepeat(120,120);
while (Continuer)
{
//Gestion des événements
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_KP_ENTER : fenetre = SDL_SetVideoMode (800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN); break;
}
break;
}
temps_actuel = SDL_GetTicks();
if (temps_actuel - temps_precedent > fvitesse1)
{
for (i=0; i<nbr_goutte; i++)
{
Coord_Goutte_Y[i] += fvitesse2;
//Coord_Goutte_Y[i] += (temps_actuel - temps_precedent) * (fvitesse2 / fvitesse1);
if (Coord_Goutte_Y[i] > hauteur_fenetre)
{
Coord_Goutte_Y[i] = 0;
Coord_Goutte_X[i] = nbr_aleatoire(1, 800);
}
}
temps_precedent -= fvitesse1;
}
SDL_FillRect (fenetre, NULL, SDL_MapRGB(fenetre->format, 0, 0, 0));
//SDL_DisplayFormat(image_de_fond);
//SDL_BlitSurface (image_de_fond, NULL, fenetre, &coord_image_de_fond);
for(i = 1; i<nbr_goutte; i++)
{
coord_goutte.x = Coord_Goutte_X[i];//assignement d'une valeur aléatoire aux coordoonnées en X de la goutte qui va être dessinée
coord_goutte.y = Coord_Goutte_Y[i];//Coordonnées de départ en Y de la goutte qui va être dessinée
SDL_FillRect (goutte[i], NULL, SDL_MapRGB(fenetre->format, couleur_goutte1, couleur_goutte2, couleur_goutte3));
SDL_SetAlpha (goutte[i], SDL_SRCALPHA, 60);
SDL_BlitSurface (goutte[i], NULL, fenetre, &coord_goutte);
}
//--------------------------------------------------------------------------
//Test de la valeur de certaines variables.
TTF_Font *police = NULL;
SDL_Surface *texte = NULL;
SDL_Rect coord_texte;
SDL_Color couleur = {255, 255, 255};
police = TTF_OpenFont("arial.ttf", 25);
char txt[200] = "";
sprintf (txt, "Nombre de gouttes : %ld", nbr_goutte);
texte = TTF_RenderText_Solid (police, txt, couleur);
coord_texte.x = 400;
coord_texte.y = 300;
SDL_BlitSurface (texte, NULL, fenetre, &coord_texte);
//--------------------------------------------------------------------------
SDL_Flip(fenetre);
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
//Libération de la mémoire pour le tableau de surface
for (i=0; i<nbr_goutte; i++)
SDL_FreeSurface(goutte[i]);
//--------------------------------------------------------------------------
}
///FIN PLUIE
///============================================================================= |
Partager