CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Dégradé avec SDL

Menthaloyd
Menthaloyd
Niveau 10
22 avril 2011 à 14:38:31

Bonjour à tous,
Je ne comprends pas comment faire un dégradé du blanc vers le noir avec SDL. J'ai réussi le noir vers le blanc mais l'inverse je n'y arrive pas. Je créer une variable "i" qui me sert à faire la couleur, la position et les boucles. Pour faire du blanc il faut que toutes les couleurs soient à 255 mais comme la position 255 se trouve en bas le dégradé est exactement que celui d qui part du noir. J'ai bien essayé de prendre une variable différente pour la couleur et garder le "i" pour la position mais là plus rien n'apparait à l'écran, même pas la fenêtre.
Ca doit bien faire une heure que je cherche désespérément la solution mais rien ne me vient.

Aldebran
Aldebran
Niveau 10
22 avril 2011 à 15:50:19

Montre nous un peu de code pour qu'on puisse t'aider. Si tu arrives à faire un dégradé noir vers blanc, tu devrais sans problème réussir l'inverse, il doit juste y avoir une petite erreur quelque part.

A priori si j'ai bien compris, tu utilises ta variable i qui correspond à la fois à ta position et ta couleur. As-tu essayé de prendre 255-i pour la couleur ?

Pocolo
Pocolo
Niveau 10
22 avril 2011 à 16:04:52

" Si tu arrives à faire un dégradé noir vers blanc, tu devrais sans problème réussir l'inverse "

C'est ce que je me suis dis aussi en lisant le post.

Menthaloyd
Menthaloyd
Niveau 10
22 avril 2011 à 17:27:59

Désolé je n'étais pas chez moi.
Voilà le code:

  1. include <stdlib.h>
  2. include <stdio.h>
  3. include <SDL/SDL.h>

void pause();

int main(int atgc, char *argv[])
{
SDL_Surface *ecran = NULL;
SDL_Surface *lignes[256] = {NULL};
SDL_Rect position;
int i = 0;

SDL_Init(SDL_INIT_VIDEO);

ecran = SDL_SetVideoMode(640, 256, 32, SDL_HWSURFACE);

for (i = 0 ; i <= 255; i++)
lignes[i] = SDL_CreateRGBSurface(SDL_HWSURFACE, 640, 1, 32, 0, 0, 0, 0);

SDL_WM_SetCaption("Mon dégradé en SDL !", NULL);

SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0 , 0 , 0 ));

for(i = 255; i >= 0; i--)
{
SDL_FillRect(lignes[i], NULL, SDL_MapRGB(ecran -> format, i, i, i));
position.x = 0;
position.y = i;
SDL_BlitSurface(lignes[i], NULL, ecran, &position);
}

SDL_Flip(ecran);

pause();

for(i = 0; i <= 255; i++)
SDL_FreeSurface(lignes[i]);

SDL_Quit();

return EXIT_SUCCESS;
}

void pause()
{
int continuer = 1;
SDL_Event event;

while (continuer)
{
SDL_WaitEvent (&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
}
}
}

Menthaloyd
Menthaloyd
Niveau 10
22 avril 2011 à 17:33:59

Je n'ai pas eu de problème du noir vers le blanc puisque i va de 0 à 255 pour la couleur et pour la position. Hors pour aller du blanc vers le noir il faut que la position aile de 0 vers 255 et la couleur de 255 à 0 . J'ai essayé de prendre deux variables comme je l'ai dit plus haut mais rien ne fonctionne.

godrik
godrik
Niveau 30
22 avril 2011 à 18:10:28

Quel est le probleme que tu recontres ? qu'est ce que ca veut dire "rien ne fonctionne" ? a quel position le code affiche t'il la couleur blanche ?

Pocolo
Pocolo
Niveau 10
22 avril 2011 à 18:22:15

" J'ai essayé de prendre deux variables comme je l'ai dit plus haut mais rien ne fonctionne. "

Ça devrait pourtant le faire sans problème avec une deuxième variable, t'as du faire une erreur quelque part...

Au pire tu peux juste écrire ça:

position.y = 255 - i;

Ça fait plus brouillon mais ça devrait marcher aussi.

Menthaloyd
Menthaloyd
Niveau 10
22 avril 2011 à 18:40:08

Quand je lance le programme avec mes deux variables la fenêtre ne s'affiche pas. La couleur blanche s'affiche tout en bas comme si je faisais un dégradé de noir vers du blanc ce qui est normal vu que dans ce code la position initiale de i est à 255.

Pocolo :d) Je ne comprends pas comment ton bout de code fonctionne. i est égal à beaucoup de nombre donc il ne peut pas soustraire un autre.

Pocolo
Pocolo
Niveau 10
22 avril 2011 à 18:41:28

" Pocolo :d) Je ne comprends pas comment ton bout de code fonctionne. i est égal à beaucoup de nombre donc il ne peut pas soustraire un autre. "

L'as-tu essayé au moins?

Menthaloyd
Menthaloyd
Niveau 10
22 avril 2011 à 18:42:33

Je pense bien qu'il marche mais j'aimerai juste des explications.

Menthaloyd
Menthaloyd
Niveau 10
22 avril 2011 à 18:45:00

Ah mais oui. Ok merci beaucoup, c'était tout bête finalement. Et moi qui n'arrive même pas à faire un dégradé...

Pocolo
Pocolo
Niveau 10
22 avril 2011 à 18:46:51

C'est juste une (très) simple question logique.

Au premier tour de boucle (je parle du "for" ou tu blit les rectangles) i est égal a 255 puisque tu lui a attribué cette valeur.

Donc au premier tout de boucle 255 - i reviens au meme que 255 - 255, ce qui donne 0 comme première coordonnée y.
Au deuxième tour de boucle tu enlèves 1 a i (donc 255-1 = 254), donc la position.y est égal a 255 - 254, ce qui donne 1 et ainsi de suite...

Menthaloyd
Menthaloyd
Niveau 10
22 avril 2011 à 18:48:40

Par contre si je veux mettre un peu de couleur dans tout ça. Disons un dégradé de rouge clair à vert foncé. Je dois faire une variable pour chaque couleur? ( je parle du rouge, du vert et du bleu.)

Aldebran
Aldebran
Niveau 10
22 avril 2011 à 22:34:58

"Par contre si je veux mettre un peu de couleur dans tout ça. Disons un dégradé de rouge clair à vert foncé. Je dois faire une variable pour chaque couleur? ( je parle du rouge, du vert et du bleu.)"

Tu n'as pas l'air de trop comprendre ce que tu fais :)

Regarde un peu cette fonction :

SDL_FillRect(lignes[i], NULL, SDL_MapRGB(ecran -> format, i, i, i));

Les trois derniers i correspondent aux composantes RGB (Red, Green, Blue). Quand une composante vaut 0 alors elle est noir, si elle vaut 255 alors elle complètement allumée. Par exemple 255, 0, 0 allume le rouge à fond et éteint le vert et le bleu donc ça donnera du rouge pétant. De même 0, 0, 255 donnera du bleu pétant. Ensuite tu peux combiner les couleurs : 255, 255, 0 donnera du jaune (= rouge + vert).
Puis tu peux faire varier l'intensité de chacune des couleurs, d'où pour avoir du rouge foncé on pourra utiliser 128, 0, 0.

Tu comprends maintenant que pour avoir ton dégradé noir vers blanc tu faisais progresser la couleur de (0, 0, 0) (= noir) vers (255, 255, 255) (= blanc).
Si tu veux avoir un dégradé de noir vers rouge, il faut passer de (0, 0, 0) à (255, 0, 0) et de rouge à bleu ça donnera de (255, 0, 0) à (0, 0, 255).

Au niveau du code pour passer du rouge au bleu il te suffit de remplacer ta fonction :

SDL_FillRect(lignes[i], NULL, SDL_MapRGB(ecran -> format, i, i, i));

Par celle-ci :

SDL_FillRect(lignes[i], NULL, SDL_MapRGB(ecran -> format, 255-i, 0, i));

Si tu veux raffiner un peu plus en faisant du rouge clair à vert foncé, ce sera un chouia plus compliqué, il faut trouver un moyen de passer de (255, 128, 128) à (0, 128, 0) (par exemple).

Une solution à l'arrache :

SDL_FillRect(lignes[i], NULL, SDL_MapRGB(ecran -> format, 255-i, 128, 128-i/2));

Le mieux est encore d'écrire une fonction qui prend en paramètre ta couleur de départ et ta couleur d'arrivée, mais ça te demandera un petit peu de réflexion.

Menthaloyd
Menthaloyd
Niveau 10
24 avril 2011 à 11:30:14

Ok merci. Je fais les évènements en ce moment et ça ne me parait pas trop dur.

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment