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 :

[debug] Rien ne s'affiche (fenetre noire)


Sujet :

SDL

  1. #1
    Membre habitué Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Points : 154
    Points
    154
    Par défaut [debug] Rien ne s'affiche (fenetre noire)
    Bonjour Bonjour,

    je suis un débutant en train de suivre le tuto de loki sur le sdl (mais en C au lieu de cpp) en utilisant les tutoriaux à ma façon. La j'ai écrit un bout de prog et je ne comprend pas pourquoi rien ne s'affiche à l'écran. ça serait cool si vous pouviez m'aider.

    Main :
    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
     
    int main (int argc, char* args[])
    {
        if (!initialisation())
        {
            return 1;
        }
     
        // Création du fond
        fond_image = charger_image("fond.bmp");
        int x = 0;
        int y = 0;
     
        for (y=0; y<ECRAN_HAUTEUR; y=y+16)
        {
            for (x=0; x<ECRAN_LARGEUR; x=x+16)
            {
                appliquer_surface(x, y, fond_image, fond);
                printf("X : %u, Y : %u\n", x, y);
            }
        }
        appliquer_surface(0, 0, fond, ecran);
        SDL_Flip(ecran);
     
        //Tant que l'utilisateur ne veut pas quitter
        while (quitter == false)
        {
            while (SDL_PollEvent(&evenement))
            {
                if (evenement.type == SDL_QUIT)
                {
                        quitter = true;
                }
                if (evenement.type == SDL_KEYDOWN)
                {
                    gestion_clavier();
                }
            }
     
            // Mise à jour de l'écran
            if (SDL_Flip(ecran) == -1)
            {
                return EXIT_FAILURE;
            }
        }
        nettoyage();
        return 0;
    }
    en fait l'image fond.bmp fait 16x16px et j'aimerais l'afficher sur toute la fenetre. Les variables de la taille de l'écran sont fixées ce n'est pas ça le problème et quitter = false

    appliquer_surface
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        SDL_Rect offset;
     
        offset.x = x;
        offset.y = y;
     
        // On blitte la surface
        SDL_BlitSurface(source, NULL, destination, &offset);
    selon moi le problème vient plutot de la parce que je comprend pas trop comment fonctionne cette fonction , si j'ai bien compris on colle une image sur une autre image ?

    Si jamais la fonction charger_image
    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
     
    SDL_Surface* charger_image(char* fichier)
    {
        // Surface tampon qui nous servira pour charger l'image
        SDL_Surface* image_chargee = NULL;
     
        // Nouvelle image optimisée
        SDL_Surface* image_optimisee = NULL;
     
        // Chargement de l'image
        image_chargee = SDL_LoadBMP(fichier);
     
        // Si le chargement se passe bien
        if (image_chargee != NULL)
        {
            // Création de l'image optimisée
            image_optimisee = SDL_DisplayFormat(image_chargee);
     
            // Libération de l'ancienne image
            SDL_FreeSurface(image_chargee);
     
            if (image_optimisee != NULL)
            {
                SDL_SetColorKey(image_optimisee, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB(image_optimisee->format, 0x00, 0xFF, 0x00) );
            }
        }
     
        // On retourne l'image optimisée
        return image_optimisee;
    }
    Merci d'avance, et désolé d'avoir posté autant de code je sais qu'il est fastidieux de débugger un gros code mais vu que j'ai aucune erreur d'affichée, je sais pas d'ou ça peut venir.

    Merci d'avance pour votre aide.

  2. #2
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Où est-ce que tu initialises "fond" ?

    Il y a tout le main ?
    fond_image, ecran... sont des variables globales ?

  3. #3
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    salut,


    juste quelque petites remarques qui t'aiderons peut être à résoudre ton soucis.
    Déjà test le retour de ta focntion pour charger l'image, on ne sais jamais, peut être que ça peut venir de là.

    Ensuite je ne vois pas l'endroit où tu initialise les propriétés w (witdh) et h (height) de ta structure offset (dans appliquer_surface).

    J'espère que ça pourra t'aider dans un premier temps
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  4. #4
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par MrDuChnok
    Ensuite je ne vois pas l'endroit où tu initialise les propriétés w (witdh) et h (height) de ta structure offset (dans appliquer_surface).
    Je ne pense pas que ça ait d'impact : dans le rectangle de destination, seule la position (x, y) est utilisée par SDL_BlitSurface. Le reste (w, h) est ignoré.

  5. #5
    Membre habitué Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Points : 154
    Points
    154
    Par défaut
    Alors pour les précisions en plus :
    au sommet de mon code :
    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
     
    // Fichiers d'entête
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <string.h>
     
    // Attributs de l'écran
    const int ECRAN_LARGEUR = 800;
    const int ECRAN_HAUTEUR = 600;
    const int ECRAN_BPP = 32;
     
    // Les surfaces
    SDL_Surface* ecran = NULL;
    SDL_Surface* fond = NULL;
    SDL_Surface* fond_image = NULL;
     
    // Structure d'évenement
    SDL_Event evenement;
     
    bool quitter = false;

    Et ma fonction init :
    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
    bool initialisation(void)
    {
        //Initialisation de tous les sous-systemes de SDL
        if(SDL_Init(SDL_INIT_EVERYTHING) == -1)
        {
            return false;
        }
     
        //Mise en place de l'ecran
        ecran = SDL_SetVideoMode(ECRAN_LARGEUR, ECRAN_HAUTEUR, ECRAN_BPP, SDL_SWSURFACE );
     
        //Si il y a une erreur lors de la mise en place de l'ecran
        if(ecran == NULL )
        {
            return false;
        }
     
        //on met en place la barre caption de la fenetre
        SDL_WM_SetCaption("Cars", NULL);
     
        //si tout s'est bien passé
        return true;
    }
    Je ne vois vraiment pas le problème. Merci pour votre aide

  6. #6
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    appliquer_surface(x, y, fond_image, fond);
    tu appliques fond_image (ton image chargée precedemment) sur fond (qui est à NULL), il faut que tu appliques ton image sur l'ecran au moins pour qu'elle s'affiche.

    Si bien evidemment je ne me suis pas trompé sur la fonction de ta fonction appliquer_image() ^^

    comme il manque certain morceaux de code, il est possible que fond ne soit pas vraiment à NULL...
    envoies moi ton code sur mon mail si tu veux, je regarderais ça

    tu as essayé de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    appliquer_surface(0, 0, fond, ecran);
    avant ta boucle for ?

  7. #7
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    je comprend pas trop comment fonctionne cette fonction , si j'ai bien compris on colle une image sur une autre image ?
    La fonction SDL_BlitSurface permet de coller en effet une partie de surface sur une autre surface.

    Tu définis la partie de surface à copier avec les deux premiers paramètres : la surface elle-même, et l'adresse d'un rectangle qui représente une partie de la surface (si l'adresse est NULL, on copie toute la surface).

    Et ensuite, tu définis où tu colles "l'image" avec les deux paramètres suivants : la surface de destination et la position sur cette surface.

    Comme le dis loka, a priori, fond est NULL. Il ne correspond donc à aucune surface réelle. Quand tu fais appliquer_surface(x, y, fond_image, fond), tu recopies ta surface fond_image sur... rien ! Et quand tu fais appliquer_surface(0, 0, fond, ecran), tu ne recopies rien sur ton écran !

  8. #8
    Membre habitué Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Points : 154
    Points
    154
    Par défaut
    Citation Envoyé par loka
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    appliquer_surface(x, y, fond_image, fond);
    tu appliques fond_image (ton image chargée precedemment) sur fond (qui est à NULL), il faut que tu appliques ton image sur l'ecran au moins pour qu'elle s'affiche.

    Si bien evidemment je ne me suis pas trompé sur la fonction de ta fonction appliquer_image() ^^

    comme il manque certain morceaux de code, il est possible que fond ne soit pas vraiment à NULL...
    envoies moi ton code sur mon mail si tu veux, je regarderais ça

    tu as essayé de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    appliquer_surface(0, 0, fond, ecran);
    avant ta boucle for ?

    Je pense que ça vient effectivement du fait que le fond est null, mais j'aimerais justement ne pas charger d'image sur le fond avant ma boucle pour ne pas dépendre d'une résolution d'écran (but de ma boucle), donc comment charger un fond vide sans image (vide) mais qui n 'est pas nul ?

    Merci pour votre aide

    Sinon loka merci pour tes tutos ils sont excellents, si j'ose m'aventurer dans une critique, j'aurais plus appronfondi la partie installation de SDL_ttf car on ne sait pas forcément ou mettre les fichiers téléchargés. Sinon parfait

  9. #9
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    Citation Envoyé par PoZZyX
    Je pense que ça vient effectivement du fait que le fond est null, mais j'aimerais justement ne pas charger d'image sur le fond avant ma boucle pour ne pas dépendre d'une résolution d'écran (but de ma boucle), donc comment charger un fond vide sans image (vide) mais qui n 'est pas nul ?

    Merci pour votre aide

    Sinon loka merci pour tes tutos ils sont excellents, si j'ose m'aventurer dans une critique, j'aurais plus appronfondi la partie installation de SDL_ttf car on ne sait pas forcément ou mettre les fichiers téléchargés. Sinon parfait

    merci ^^
    Tu n'est pas le seul à me faire la remarque sur sdl_ttf, il est temps de faire un petit chapitre sur son installation

    pour ton problème, pose directement ton image sur ta surface ecran et non sur fond qui n'a pas besoin d'exister apparemment si j'ai bien compris

  10. #10
    Membre habitué Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Points : 154
    Points
    154
    Par défaut
    Bah en fait on va poser la vrai question.

    J'ai une image de 16x16px et j'aimerais faire le fond de mon écran avec cette image en mosaique. Comment faire cela ?

    C'est ça la question qu'il aurait fallu poser depuis le début

  11. #11
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    donc en gros ton image est ton fond (enfin la repetition de ton image ^^), donc il faut bien la poser directement sur la surface ecran et non sur une surface fond inexistante.
    Tu créés bien une image en memoire avec ta mosaïque et quand tu fais SDL_Flip(...), ton "fond" s'afficheras

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // Création du fond
        fond_image = charger_image("fond.bmp");
        int x = 0;
        int y = 0;
     
        for (y=0; y<ECRAN_HAUTEUR; y=y+16)
        {
            for (x=0; x<ECRAN_LARGEUR; x=x+16)
            {
                appliquer_surface(x, y, fond_image, ecran);
                printf("X : %u, Y : %u\n", x, y);
            }
        }
        SDL_Flip(ecran);
    il me semble que ça devrais marcher (pas testé car au boulot ^^)

    Par contre si tu veux pas directement poser ça sur l'ecran, il te faudra charger une image de fond avant (même une image toute blanche, transparente, ou ce que tu veux :p) pour pouvoir y appliquer quelquechose dessus.

  12. #12
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par loka
    Par contre si tu veux pas directement poser ça sur l'ecran, il te faudra charger une image de fond avant (même une image toute blanche, transparente, ou ce que tu veux :p) pour pouvoir y appliquer quelquechose dessus.
    Une autre solution si tu ne veux pas directement blitter ton image de fond sur l'écran, c'est de créer une surface de toute pièce (pas forcément à partir d'une image), en utilisant la fonction SDL_CreateRGBSurface :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SDL_Surface *SDL_CreateRGBSurface(Uint32 flags, int width, int height, int
    depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask);

  13. #13
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    Exact, je n'y avait pas pensé sur le coup

  14. #14
    Membre habitué Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Points : 154
    Points
    154
    Par défaut
    Citation Envoyé par loka
    donc en gros ton image est ton fond (enfin la repetition de ton image ^^), donc il faut bien la poser directement sur la surface ecran et non sur une surface fond inexistante.
    Tu créés bien une image en memoire avec ta mosaïque et quand tu fais SDL_Flip(...), ton "fond" s'afficheras

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // Création du fond
        fond_image = charger_image("fond.bmp");
        int x = 0;
        int y = 0;
     
        for (y=0; y<ECRAN_HAUTEUR; y=y+16)
        {
            for (x=0; x<ECRAN_LARGEUR; x=x+16)
            {
                appliquer_surface(x, y, fond_image, ecran);
                printf("X : %u, Y : %u\n", x, y);
            }
        }
        SDL_Flip(ecran);
    il me semble que ça devrais marcher (pas testé car au boulot ^^)

    Par contre si tu veux pas directement poser ça sur l'ecran, il te faudra charger une image de fond avant (même une image toute blanche, transparente, ou ce que tu veux :p) pour pouvoir y appliquer quelquechose dessus.
    Pourquoi faire simple quand on peut faire compliqué

    Merci pour ta solution qui est simple et efficace !!!

    Merci beaucoup pour votre aide.

    ++

  15. #15
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    de rien

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 09/01/2010, 15h30
  2. [CKEditor] Rien ne s'affiche
    Par Seth77 dans le forum Bibliothèques & Frameworks
    Réponses: 13
    Dernier message: 28/04/2006, 13h40
  3. [Display lists] Rien ne s'affiche !!!
    Par guepe dans le forum OpenGL
    Réponses: 13
    Dernier message: 06/03/2006, 12h31
  4. [Eclipse3.1] Plus rien ne s'affiche dans ma console !
    Par tnodev dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 12/10/2005, 12h05
  5. [JAVASCRIPT] Rien ne s'affiche lors d'une pause
    Par stephane93fr dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/05/2005, 15h38

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