IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Exercice : réaliser un dégradé


Sujet :

SDL

  1. #1
    Membre du Club
    Homme Profil pro
    Pâtissier
    Inscrit en
    Avril 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Pâtissier

    Informations forums :
    Inscription : Avril 2014
    Messages : 32
    Points : 59
    Points
    59
    Par défaut Exercice : réaliser un dégradé
    Bonjour,
    Je viens demander votre aide pour un programme très simple.
    Un dégrade [blanc à noir], je ne comprend pas pourquoi mais le programme m'affiche l'inverse [noir vers blanc].
    Je post donc pour avoir là réponse à ce qui est pour moi un mystère total.
    Je ne sais pas si ce code est dit "propre" je suis a l’écoute de toute critique =)

    Merci de votre lecture et de vos réactions =)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include "SDL/SDL.h"
     
    #define WIDTH_WINDOW 640
    #define HEIGHT_WINDOW 256
    #define NAME_WINDOW  "TEST SDL : Degrader inverser"
     
    void pause() ;
    void startSDL() ;
     
    int  main(int argc, char *argv[])
    {
    	//Initialisation
    	int a, b, c ;
    	a = 0 ;
    	b = 255 ;
    	c = 0 ;
     
    	SDL_Surface *screen = NULL ;
    	SDL_Surface *degrade[HEIGHT_WINDOW] = {NULL} ;
    	SDL_Rect position ;
     
    	//Start SDL, name of windows
    	startSDL() ;
    	SDL_WM_SetCaption(NAME_WINDOW, NULL);
     
    	screen = SDL_SetVideoMode(WIDTH_WINDOW, HEIGHT_WINDOW, 32, SDL_HWSURFACE) ;
     
    	//Color of screen
    	SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0)) ;
     
     
    	while(a <= (HEIGHT_WINDOW - 1))
    	{
    		degrade[a] = SDL_CreateRGBSurface(SDL_HWSURFACE, WIDTH_WINDOW, 1, 32, 0, 0, 0, 0) ;
    		a++ ;
    	}
     
    	//Color of degradé, blitter degradé
    	while(b >= 0)
    	{
    		position.x = 0 ;
    		position.y = b ;
     
    		SDL_FillRect(degrade[b], NULL, SDL_MapRGB(screen->format, b, b, b)) ;
    		SDL_BlitSurface(degrade[b], NULL, screen, &position) ;
     
    		b-- ;
    	}
     
    	//Update
    	SDL_Flip(screen) ;
    	pause() ;
     
    	//Free 
    	while (c <= 255)
    	{	
    		SDL_FreeSurface(degrade[c]) ;
    		c++ ;
    	}
     
    	pause() ;
    	SDL_Quit() ;
    	return EXIT_SUCCESS ;
    }
     
    void pause()
    {
    	int i = 1;
        SDL_Event event;
     
        while (i)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    i = 0;
            }
        }
    }
     
    void startSDL()
    {
    	//Start SDL, if no start display error
    	if(SDL_Init(SDL_INIT_VIDEO))
    	{
    		fprintf(stderr, "Error SDL : %s\n", SDL_GetError()) ;
    		exit(EXIT_FAILURE) ;
    	}
    }

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Le code n'est pas propre , il y a plein de truc a revoir.
    le premier truc c'est "SDL/SDL.h" , ça doit etre <SDL/SDL.h> , rien que pour ton coe soit portable.

    Les variable du genre : " int a, b, c ; " sont déconseille a une lettre surtout que pour moi a,b,c c'est pour un triangle.
    Il n'y a pas de game loop bon c'est pas une mauvaise pratique de pas en faire mais vu que tu devras en faire un jour ou l'autre.
    Après il faut savoir ce qu'on fait , tu fait " : degrade[a] = SDL_CreateRGBSurface(SDL_HWSURFACE, WIDTH_WINDOW, 1, 32, 0, 0, 0, 0) ; " , tu le met a 32 bits , alors que tu fais un simple degradé en gris alors mets plutôt 16 ou 24 , ça change quoi ? , ben c'est simple ça prend moins de place en mémoire et c'est plus rapide (en 32 ça lui évite de tester alpha) , on peut parler aussi pour le screen perso je le met toujours en 24.

    Maintenant algorithme je le trouve très mal penser créer plusieurs surface puis mettre chaque surface une couleur
    j'aurais créer une surface et j'aurais modifié pixel par pixel (ou même directement modifie pixel par pixel screen) , déjà ça te permettra de te familiariser comment la SDL fonctionne , comment une image fonctionne aussi et donc optimiser certaine technique de rendu software.

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je vous conseille d'utiliser des noms de variable plus logique, car 'a', 'b' et 'c', chez moi, ça ne veut rien dire de précis.
    Après, pour le débogue, je conseille de printf(), la variable b.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre du Club
    Homme Profil pro
    Pâtissier
    Inscrit en
    Avril 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Pâtissier

    Informations forums :
    Inscription : Avril 2014
    Messages : 32
    Points : 59
    Points
    59
    Par défaut
    "Le code n'est pas propre , il y a plein de truc a revoir.
    le premier truc c'est "SDL/SDL.h" , ça doit etre <SDL/SDL.h> , rien que pour ton code soit portable."

    Je ne sait même plus pourquoi j'avais fait ça, merci

    "Les variable du genre : " int a, b, c ; " sont déconseille a une lettre surtout que pour moi a,b,c c'est pour un triangle."

    Quel nom de variable correspondrai, si vous avez un exemple pour mieux nommée par la suite.

    "Il n'y a pas de game loop bon c'est pas une mauvaise pratique de pas en faire mais vu que tu devras en faire un jour ou l'autre."

    Je ne pensait passé que 10 minutes sur ce programme c'est vraiment pour avoir les base

    "Après il faut savoir ce qu'on fait , tu fait " : degrade[a] = SDL_CreateRGBSurface(SDL_HWSURFACE, WIDTH_WINDOW, 1, 32, 0, 0, 0, 0) ; " , tu le met a 32 bits , alors que tu fais un simple degradé en gris alors mets plutôt 16 ou 24 , ça change quoi ? , ben c'est simple ça prend moins de place en mémoire et c'est plus rapide (en 32 ça lui évite de tester alpha) , on peut parler aussi pour le screen perso je le met toujours en 24."

    Oui, je me suis servit bêtement des cours sans réfléchir plus que ça, je comprend bien pour le degradé vu que c'est que du gris, et je ne sais pourquoi mais si je le passe en 16 bits j'ai plein de couleurs d'afficher ^^
    mais pour "screen" pourquoi en 24 et pas en 16 vu que on le voit pas ?
    (Je sens que dit une bêtise vu que je ne connais pas le système, mais bon on apprend de ces bêtises :p)


    "Maintenant algorithme je le trouve très mal penser créer plusieurs surface puis mettre chaque surface une couleur
    j'aurais créer une surface et j'aurais modifié pixel par pixel (ou même directement modifie pixel par pixel screen) , déjà ça te permettra de te familiariser comment la SDL fonctionne , comment une image fonctionne aussi et donc optimiser certaine technique de rendu software. "

    Je suis débutant et j'ai suivit une partie d'un tutoriel apparemment de qualité discutable, merci beaucoup je vais faire comme ça après avoir résolut le problème .

    Pour le debogge, b affiche tout les nombres de 255 à 0.
    Je ne comprend vraiment pas, 255 c'est bien egal à blanc .

    littlesamurai

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Simplement, car ce morceau de code indique que vous commencez de 255, donc, de la droite, et que vous allez faire la gauche.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Pour b , tu peux le remplacer par le nom 'couleur' ou 'gris' par exemple.
    Tu peux mettre le screen a 16 on le verra pas effectivement, mais peut être que plus tard tu mettra des images demandant plus de 16 bits en couleur.
    Sinon ,oui peut être que bosser pixel par pixel quand on débute avec le C et la SDL c'est peut être un peu difficile , mais bon de mon point de vue le dégrader et peut être pas un bon exercice pour débuter , dans le sens si algo est mauvais je n'en vois pas intérêt.

  7. #7
    Membre du Club
    Homme Profil pro
    Pâtissier
    Inscrit en
    Avril 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Pâtissier

    Informations forums :
    Inscription : Avril 2014
    Messages : 32
    Points : 59
    Points
    59
    Par défaut
    Merci beaucoup a vous deux, j’espère faire bon usage de vos conseilles .
    Je met le code au cas ou quelqu'un à le même problème
    Il me reste plus qu'a bien nommé mes variables et tester la méthode pixel par pixel :p
    Encore merci bonne journée =)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL.h>
     
    #define WIDTH_WINDOW 640
    #define HEIGHT_WINDOW 256
    #define NAME_WINDOW  "TEST SDL : Degrader inverser"
     
    void pause() ;
    void startSDL() ;
     
    int  main(int argc, char *argv[])
    {
    	//Initialisation
    	int a = 0 ;
    	int b = 0 ;
    	int c = 0 ;
    	int white = 255 ;
     
    	SDL_Surface *screen = NULL ;
    	SDL_Surface *degrade[HEIGHT_WINDOW] = {NULL} ;
    	SDL_Rect position ;
     
     
    	//Start SDL, name of windows
    	startSDL() ;
    	SDL_WM_SetCaption(NAME_WINDOW, NULL);
     
    	screen = SDL_SetVideoMode(WIDTH_WINDOW, HEIGHT_WINDOW, 24, SDL_HWSURFACE) ;
     
     
    	//Color of screen
    	SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0)) ;
     
    	while(a <= (HEIGHT_WINDOW - 1))
    	{
    		degrade[a] = SDL_CreateRGBSurface(SDL_HWSURFACE, WIDTH_WINDOW, 1, 24, 0, 0, 0, 0) ;
    		a++ ;
    	}
     
    	//Color of degradé, blitter degradé
    	while(b <= 255)
    	{
    		position.x = 0 ;
    		position.y = b ;
     
    		SDL_FillRect(degrade[b], NULL, SDL_MapRGB(screen->format, white, white, white)) ;
    		SDL_BlitSurface(degrade[b], NULL, screen, &position) ;
     
    		white-- ;
    		b++ ;
    	}
     
    	//Update
    	SDL_Flip(screen) ;
    	pause() ;
     
    	//Free 
    	while (c <= 255)
    	{	
    		SDL_FreeSurface(degrade[c]) ;
    		c++ ;
    	}
     
    	pause() ;
    	SDL_Quit() ;
    	return EXIT_SUCCESS ;
    }
     
    void pause()
    {
    	int i = 1;
        SDL_Event event;
     
        while (i)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    i = 0;
            }
        }
    }
     
    void startSDL()
    {
    	//Start SDL, if no start display error
    	if(SDL_Init(SDL_INIT_VIDEO))
    	{
    		fprintf(stderr, "Error SDL : %s\n", SDL_GetError()) ;
    		exit(EXIT_FAILURE) ;
    	}
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide pour réaliser un dégradé avec css
    Par didinet dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 08/04/2009, 21h33
  2. Réalisation d'un exercice
    Par scorpion771 dans le forum LabVIEW
    Réponses: 2
    Dernier message: 27/10/2008, 18h04
  3. Réponses: 1
    Dernier message: 19/08/2008, 11h15
  4. Réalisation d'une ligne en dégradé
    Par Speed41 dans le forum Débuter
    Réponses: 31
    Dernier message: 10/01/2008, 20h49
  5. Réaliser un button dégradé avec une icone
    Par nicolas.pied dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 19/06/2006, 22h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo