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 :

Afficher un rectangle de couleur sur l'écran


Sujet :

SDL

  1. #1
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut Afficher un rectangle de couleur sur l'écran
    Bonjour,

    Lors de la compilation, je ne récupère aucune erreur, cependant à l'éxécution la fenetre s'ouvre à peine une seconde malgré la fonction pause !

    En fait, sans la fonction Coloried_Surface le programme s'éxécute et pas de soucis ! mais je ne trouve pas la raison pour laquelle bien que ça compil sans erreur pourquoi le programme bug !


    Main.c

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include "Header.h"
     
    int main(int argc, char *argv[])
         {
     
             SDL_Surface *ecran;
             SDL_Surface *rectangle;
     
     
             //-----< Fonction qui vérifie que le chargement c'est correctement passé >-----//
                    Loading ();
     
             //-----< Fonction qui paramètre ( taille, couleur) puis affiche l'écran principal >-----// 
                    Printing_Screen ( 640, 480, 32, 128, 128, 128, ecran );
     
             //-----< Fonction qui colorie et positionne une surface sur l'écran principal >-----//
                    Coloried_Surface ( 30, 30, 32, 200, 200, 200, rectangle, ecran );
     
             //-----< Fonction qui met en pause l'écran principal >----//
                    Pause();
     
     
             SDL_FreeSurface(rectangle);
             SDL_Quit();
         }
    Fonctions.c

    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include "Header.h"
     
     
    void Pause()
    {
        int continuer = 1;
        SDL_Event event;
     
        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
            }
        }
    }
     
     
    int Loading()
     
    {
         FILE *SDL_erreur=NULL;
         SDL_erreur=fopen("erreur_initialisation.txt","r+");
     
     
         /***** On vérifie que "erreur_initialisation.txt" existe *****/
     
            if ( SDL_erreur==NULL )
              {
               fprintf( SDL_erreur, "Le fichier erreur_initialisation.txt n'existe pas !");
              }
     
            else 
              {
               fprintf( SDL_erreur, "L'initialisation va pouvoir être effectuée !");
              }
     
            fclose(SDL_erreur);
     
     
     
         /***** On vérifie l'initialisation de la SDL *****/
     
            if (SDL_Init(SDL_INIT_VIDEO) == -1) 
              {
               fprintf( SDL_erreur, "Erreur d'initialisation de la SDL : %s\n", SDL_GetError() ); 
              }
     
            else 
              {
               fprintf( SDL_erreur, "Initialisation de la SDL terminée avec succés !");
              }
     
    }
     
     
    void Printing_Screen( int largeur, int hauteur, int rcouleur, int rouge, int vert, int bleu,  SDL_Surface *tmpy_ecran )
    {
         /***** Initialisation du pointeur *****/
                tmpy_ecran = NULL;
     
         /***** Fonction qui renvoie une fenêtre, on savegarde cette surface dans une variable du même type retourné *****/
                tmpy_ecran = SDL_SetVideoMode( largeur, hauteur, rcouleur, SDL_HWSURFACE );
     
         /***** Fonction qui renvoie un Uint32 qui est la couleur choisie *****/ 
                Uint32 Couleur_ecran = SDL_MapRGB( tmpy_ecran->format, rouge, vert, bleu );
     
         /***** Fonction qui remplie la surface choisie *****/
                SDL_FillRect( tmpy_ecran, NULL, Couleur_ecran );
     
         /***** Fonction qui donne un titre à la fenêtre *****/
                SDL_WM_SetCaption( "Essai(s) SDL", NULL );
     
         /***** Fonction qui rafrachit l'écran *****/
                SDL_Flip( tmpy_ecran );
    }
     
     
    void Coloried_Surface( int X, int Y, int rcouleur, int rouge, int vert, int bleu, SDL_Surface *tmpy_surface, SDL_Surface *tmpy_ecran )
    {
         /***** Typedef qui permet de défénir les coordonnées d'une surface *****/
                SDL_Rect coordonnees;
                    coordonnees.x=X;
                    coordonnees.y=Y;
     
         /***** Fonction qui renvoie le code couleur choisi *****/   
                Uint32 couleur_surface = SDL_MapRGB ( tmpy_surface->format, rouge, vert, bleu);  
     
         /***** Fonction qui remplie la surface choisie *****/
                SDL_FillRect ( tmpy_surface, NULL, couleur_surface );   
     
         /***** Fonction qui créée une surface *****/       
                tmpy_surface = SDL_CreateRGBSurface ( SDL_HWSURFACE, X, Y, rcouleur, 0, 0, 0, 0 );
     
         /***** Fonction qui permet de coller la surface créée sur une autre surface choisie *****/
                SDL_BlitSurface ( tmpy_surface, NULL, tmpy_ecran, &coordonnees );
     
         /***** Fonction qui rafrachit l'écran *****/
                SDL_Flip ( tmpy_ecran );
     
    }
    Header.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Pause();
    void Printing_Screen ( int largeur, int hauteur, int rcouleur, int rouge, int vert, int bleu,  SDL_Surface *tmpy_ecran );
    void Coloried_Surface( int X, int Y, int rcouleur, int rouge, int vert, int bleu, SDL_Surface *tmpy_surface, SDL_Surface *tmpy_ecran )
    int Loading();
    Merci d'avance !

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Il y a un problème de portée des variables.

    Tu ne peux jamais changer la valeur d'une variable lors d'un passage de paramètre.

    Ainsi, lorsque tu écris ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                    Printing_Screen ( 640, 480, 32, 128, 128, 128, ecran );
    ecran est non initialisé et le restera après l'appel, peu importe ce que tu fais dans la fonction...

    Je te conseille de regarder cet exemple :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int fct(int a)
    {
       a = 3;
    }
     
    int main(void)
    {
       int b = 4;
       fct(b);
       printf("%d\n", b);
       return EXIT_SUCCESS;
    }
    - Il faut tester le retour de toutes les fonctions SDL.

    - tmpy_surface n'est jamais alloué.

    Jc

  3. #3
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Merci beaucoup je vais regarder ça, parce que sans faire de fonction je n'avais pas ce problème !

    Vous dites que tmpy_surface n'est jamais alloué, mais pourtant si je me réfère aux tutos que j'ai pu lire, il est stipulé que lors de la déclaration une variable de type SDL_Surface fait automatiquement un malloc donc je ne comprends pas ce que je peux faire de plus pour allouer ?

    Vous dites aussi qu'on ne peut changer la valeur d'une variable lors d'un passage par paramètre. Donc selon vous, il faut avant que je puisse utiliser cette variable comme paramètre dans la fonction, que je l'initialise ainsi ?

    SDL_Surface *ecran=NULL;

    Mais en fait je ne saisis pas ce que vous voulais me faire comprendre en me disant qu'on ne peut changer la valeur d'une variable lors d'un passage par paramètre. Moi ce que je comprends, c'est que la variable qui est utilisé en paramètre doit après avoir été utilisé dans la fonction, nepas avoir été modifié et doit avoir la même valeur. Mais dans ce cas là à quoi sert la fonction si on ne peut pas modifier son paramètre ? ( PERDU )

    Aussi vous dites qu'il faut tester le retour de toutes fonction en SDL. Donc le type de mes fonctions ne doit plus être void pour pouvoir tester quoique ce soit? il faut que ce soit de type SDL_Surface fonction(---) d'après mon code.
    Mais Quel genre de tests dois-je faire ?

    Est ce que la fonction SDL_BlitSurface() retourne une variable de type SDL_Surface ?

    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
    SDL_Surface *Coloried_Surface( int X, int Y, int rcouleur, int rouge, int vert, int bleu, SDL_Surface *tmpy_surface, SDL_Surface *tmpy_ecran )
    {
         SDL_Surface *resultat=NULL;
     
         /***** Typedef qui permet de défénir les coordonnées d'une surface *****/
                SDL_Rect coordonnees;
                    coordonnees.x=X;
                    coordonnees.y=Y;
     
         /***** Fonction qui renvoie le code couleur choisi *****/   
                Uint32 couleur_surface = SDL_MapRGB ( tmpy_surface->format, rouge, vert, bleu);  
     
         /***** Fonction qui remplie la surface choisie *****/
                SDL_FillRect ( tmpy_surface, NULL, couleur_surface );   
     
         /***** Fonction qui créée une surface *****/       
                tmpy_surface = SDL_CreateRGBSurface ( SDL_HWSURFACE, X, Y, rcouleur, 0, 0, 0, 0 );
     
         /***** Fonction qui permet de coller la surface créée sur une autre surface choisie *****/
                resultat=SDL_BlitSurface ( tmpy_surface, NULL, tmpy_ecran, &coordonnees );
     
         /***** Fonction qui rafrachit l'écran *****/
                SDL_Flip ( resultat );
    }
    Merci encore !

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Bon, reprenons à zéro :-)

    Citation Envoyé par darkwall_37 Voir le message
    Vous dites que tmpy_surface n'est jamais alloué, mais pourtant si je me réfère aux tutos que j'ai pu lire, il est stipulé que lors de la déclaration une variable de type SDL_Surface fait automatiquement un malloc donc je ne comprends pas ce que je peux faire de plus pour allouer ?
    J'aimerais voir ca. Lorsque tu crées une variable :

    La valeur n'est pas initialisé et rien est alloué. Quelque chose est allouée si tu fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    tmp = SDL_LoadImage("test.bmp");
     
    /* Ou encore... */
    tmp = SDL_CreateRGBSurface(...);
    Donc tant que tu n'as pas fait de tmp est égal à quelque chose tu ne peux pas t'en servir...


    Vous dites aussi qu'on ne peut changer la valeur d'une variable lors d'un passage par paramètre. Donc selon vous, il faut avant que je puisse utiliser cette variable comme paramètre dans la fonction, que je l'initialise ainsi ?

    SDL_Surface *ecran=NULL;
    Cela ne changerait rien. Il faut soit passer l'adresse de la variable ecran ou alors récupérer la valeur donnée par la fonction SDL_SetVideoMode dans ta fonction ...

    Je remarque d'ailleurs que ta fonction Loading avait comme signature int or elle ne retournait rien...

    Il faut qu'à un seul endroit tu aies lancé la SDL et créé la surface écran. Je te conseille de virer ton SDL_SetVideoMode de l'autre fonction Printing*, de lui passer l'ecran et de le récupérer dans la fonction Loading... Par exemple :

    Il faut aussi fermer un fichier avec fclose...

    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
     
    SDL_Surface* Loading()
     
    {
         SDL_Surface *res;
         FILE *SDL_erreur=NULL;
         SDL_erreur=fopen("erreur_initialisation.txt","r+");
     
     
         /***** On vérifie que "erreur_initialisation.txt" existe *****/
     
            if ( SDL_erreur==NULL )
              {
               fprintf( SDL_erreur, "Le fichier erreur_initialisation.txt n'existe pas !");
              }
     
            else 
              {
               fprintf( SDL_erreur, "L'initialisation va pouvoir être effectuée !");
              }
     
            fclose(SDL_erreur);
     
     
     
         /***** On vérifie l'initialisation de la SDL *****/
     
            if (SDL_Init(SDL_INIT_VIDEO) == -1) 
              {
               fprintf( SDL_erreur, "Erreur d'initialisation de la SDL : %s\n", SDL_GetError() ); 
              }
     
            else 
              {
               fprintf( SDL_erreur, "Initialisation de la SDL terminée avec succés !");
              }
     
             res = SDL_SetVideoMode( largeur, hauteur, rcouleur, SDL_HWSURFACE );
     
             if(res == NULL) {
                fprintf( SDL_erreur, "Probleme de creation de la fenetre");
             }  
     
             fclose(res);
             return res;
    }
    Mais en fait je ne saisis pas ce que vous voulais me faire comprendre en me disant qu'on ne peut changer la valeur d'une variable lors d'un passage par paramètre. Moi ce que je comprends, c'est que la variable qui est utilisé en paramètre doit après avoir été utilisé dans la fonction, nepas avoir été modifié et doit avoir la même valeur. Mais dans ce cas là à quoi sert la fonction si on ne peut pas modifier son paramètre ?
    A faire quelque chose en fonction des paramètres. Je pense que tu t'attaques à quelque chose de trop compliqué. Il te manque visiblement les bases de la programmation C pour vraiment arriver à concevoir un jeu. Je ne dis pas que tu pourras y arriver, mais il me semble plus sage de faire un pas en arrière pour mieux avancer.

    Aussi vous dites qu'il faut tester le retour de toutes fonction en SDL. Donc le type de mes fonctions ne doit plus être void pour pouvoir tester quoique ce soit? il faut que ce soit de type SDL_Surface fonction(---) d'après mon code.
    Mais Quel genre de tests dois-je faire ?
    Non, tu dois normalement tester toute fonction qui n'a pas de retour void. Les retours des fonctions SDL_SetVideoMode et SDL_CreateRGBSurface ont besoin d'être testé par exemple.

    Est ce que la fonction SDL_BlitSurface() retourne une variable de type SDL_Surface ?
    Non mais il retourne un entier : 0 si tout s'est bien passé, -1 sinon. Généralement, on ne teste pas son retour pour des raisons de performances...

    Et pour ton code :

    [CODE]
    SDL_Surface *Coloried_Surface( int X, int Y, int rcouleur, int rouge, int vert, int bleu, SDL_Surface *tmpy_surface, SDL_Surface *tmpy_ecran )
    [/quote]
    Tu as un retour SDL_Surface* mais pas de return...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
         /***** Fonction qui renvoie le code couleur choisi *****/   
                Uint32 couleur_surface = SDL_MapRGB ( tmpy_surface->format, rouge, vert, bleu);  
     
         /***** Fonction qui remplie la surface choisie *****/
                SDL_FillRect ( tmpy_surface, NULL, couleur_surface );
    Pourquoi pas mais attention, ici tu suppose que tmpy_surface est une surface créée, or juste après :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
         /***** Fonction qui créée une surface *****/       
                tmpy_surface = SDL_CreateRGBSurface ( SDL_HWSURFACE, X, Y, rcouleur, 0, 0, 0, 0 );
    Si tu fais ca, c'est que tmpy_surface n'était pas alloué avant ? ou alors que tu as perdu l'ancien tmpy_surface ? bref, ce n'est pas clair...

    Autre chose, tu as crées une surface de X,Y pixels et tu veux les coller à l'écran à la position X,Y. Ce n'est pas faux mais attention, si X,Y deviennent trop grand tu ne verras plus rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
         /***** Fonction qui permet de coller la surface créée sur une autre surface choisie *****/
                resultat=SDL_BlitSurface ( tmpy_surface, NULL, tmpy_ecran, &coordonnees );
    Non, SDL_BlitSurface retourne un entier, la fonction modifie tmpy_ecran en copiant tmpy_surface à la position coordonnees.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
         /***** Fonction qui rafrachit l'écran *****/
                SDL_Flip ( resultat );
    Ne devrait pas être ici mais avec la boucle principale.

    Je te conseille de regarder :
    http://jeux.developpez.com/tutoriels/#a_sdl

    Jc

  5. #5
    Membre actif Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Points : 245
    Points
    245
    Par défaut
    Je pense que tu t'attaques à quelque chose de trop compliqué. Il te manque visiblement les bases de la programmation C pour vraiment arriver à concevoir un jeu. Je ne dis pas que tu pourras y arriver, mais il me semble plus sage de faire un pas en arrière pour mieux avancer.
    Nan moi je pense que c'est en étant confronté directement aux problèmes ( notamment lors de la création d'un jeu ) que l'on apprend le mieux.
    Bien évidemment, hors de question de tenter la création d'une appli sans aucune connaissance en C, je dirais plutot que c'est ce genre de problèmes qui force le concerné à adapter son code, au fur et à mesure qu'il se remémore les bons vieux plantages dûs à par exemple des problèmes de portée ( c'est du vécu ).

    En revanche, je trouve que certaine fonctions sont totalement inutiles dans le sens où je n'ai vu qu'une partie ( probablement ) de ton code, et que pour ce que j'en ai vu il ne m'aurait pas semblé nécessaire dans l'immédiat de créer des fonctions...

  6. #6
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Merci pour le temps accordé fearyourself et de ta patience ! En fait j'ai sorti la ligne ecran=SDL_SetVideoMode(...) de ma fonction et l'ai mise dans main et aprés tout à fonctionné.
    En ce qui concerne les bases, entre théorie et pratique y'a des choses qui ne sont pas évidentes à appliquer et comprendre tout de suite sans recul et sans pratique, il est clair que s'y confronter ainsi est pour moi une bonne manière de progresser quitte à passer pour un guignol. Et je suppose que la pluspart sont aussi passés par là donc...

    Encore merci

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

Discussions similaires

  1. Afficher un fichier .TXT (existant) sur l'écran
    Par Horin dans le forum Windows Forms
    Réponses: 2
    Dernier message: 26/10/2009, 14h17
  2. Problème de couleur sur écran portable
    Par Aitone dans le forum Périphériques
    Réponses: 17
    Dernier message: 16/01/2007, 12h55
  3. Réponses: 5
    Dernier message: 17/11/2006, 17h49
  4. Afficher en SDL et en OpenGL sur un écran ?
    Par Tittom dans le forum API graphiques
    Réponses: 3
    Dernier message: 21/06/2006, 10h08
  5. [VB.NET] [WinForms] Afficher un rectangle sur une image
    Par Noodles dans le forum Windows Forms
    Réponses: 3
    Dernier message: 20/12/2004, 10h36

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