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 :

Programme test :Problème de démarage de l'exécutable


Sujet :

SDL

  1. #1
    Membre régulier Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Points : 101
    Points
    101
    Par défaut Programme test :Problème de démarage de l'exécutable
    Bonjour,
    voilà, j'apprends à utiliser SDL et j'ai fait un petit programme pour afficher des images en utilisant le principe : clic_sélection/clic_déposer l'image. Je suis sous Linux Debian Lenny et je code dans Codeblocks.
    Une image pour mieux comprendre :


    Sous codeblocks mon programme fonctionne avec un bug important : je n'arrive pas toujours à effacer mes images en cliquant sur le bouton effacer. Le plus souvent ça fonctionne mais qq fois ça ne marche pas.

    En revanche je n'arrive pas à faire foncionner mon programme en dehors de codeblocks avec l'exécutable.
    Avec gdb ça marche, je n'ai pas d'erreur.
    (gdb) run
    Starting program: /home/acryline/programmation/SDL/test3/bin/Debug/test2
    [Thread debugging using libthread_db enabled]
    [New Thread 0xb7516940 (LWP 6131)]
    Program exited normally
    Donc en résumé voici mes deux questions :
    - pourquoi le bouton effacer ne fonctionne t-il pas toujours ?
    - que dois-je faire pour faire fonctionner mon programme en dehors de codeblocks et de gdb ?
    - si vous trouvez d'autres bug (j'ai mal défini la zone de dessin , elle ne va pas assez haut etc..)


    Merci pour vos réponses.


    Voici le code zippé de mon programme + les images nécessaires pour le faire fonctionner :http://www.cogite.info/fichiers/test.zip

    Et pour ceux qui ne veulent pas le télécharger voici le code en trois fichiers : :p

    header.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #ifndef DEF_SDL
    #define DEF_SDL
     
    void evenement (SDL_Surface*, SDL_Surface *,SDL_Surface *, SDL_Rect*);
    #endif
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include "header.h"
     
    int main(int argc, char *argv[])
     {
         SDL_Surface *ecran = NULL, *zozor =NULL, *fond=NULL;
         SDL_Rect pos_fond, pos_zozor;
     
     
         if(SDL_Init(SDL_INIT_VIDEO)==-1)
         {
            printf("Erreur d'initialisation de la SDL : %s\n", SDL_GetError());
            exit(EXIT_FAILURE); // On quitte le programme
         }
         ecran= SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
          if(ecran==NULL)
          {
            printf( "Impossible de charger le mode vidéo : %s\nq", SDL_GetError());
            exit(EXIT_FAILURE);
          }
         SDL_WM_SetCaption(" Dessin ", NULL);
         SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,255, 255,255));
         //chargement des images et affichage
         zozor= IMG_Load("zozor.bmp");
         fond= IMG_Load("fond.bmp");
     
         SDL_SetColorKey(zozor,SDL_SRCCOLORKEY,SDL_MapRGB(zozor->format,0,0,255));
         SDL_BlitSurface(fond,NULL,ecran,&pos_fond);
         SDL_BlitSurface(zozor,NULL,ecran,&pos_zozor);
     
         SDL_Flip(ecran);
         //boucle
         evenement(ecran,zozor,fond,&pos_zozor);
         SDL_FreeSurface(fond);
         SDL_FreeSurface(zozor);
         SDL_Quit();
         return EXIT_SUCCESS;
     }
    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include "header.h"
     
    void evenement (SDL_Surface* ecran, SDL_Surface *zozor, SDL_Surface *fond,SDL_Rect *pos_zozor)
    {
        int continuer =1;
        SDL_Rect pos_fond;
        SDL_Event event;
         pos_zozor->x=-1;
         pos_zozor->y=-1;
     
     
        while(continuer)
        {
            SDL_PollEvent(&event);
            switch (event.type)
            {
              case SDL_QUIT:
              continuer=0;
              break;
              //mouvement de la souris
              case SDL_MOUSEMOTION:
                switch(event.button.button)
                {
                    //si le bouton gauche est enfoncé zozor prend les coordonnées de la souris
                    case SDL_BUTTON_LEFT:
                       pos_zozor->x=event.button.x-(zozor->w/2);
                       pos_zozor->y=event.button.y-(zozor->h/2);
                    break;
                    default:
                    //printf("%d\n",event.button.y);
                    break;
     
                }
              //si on clique 
              case SDL_MOUSEBUTTONDOWN:
                switch(event.button.button)
                {
                    //clic grauche
                    case SDL_BUTTON_LEFT:
                    //si la souris est au delà de la coordonnée x= 100
                    if(event.button.x<100)
                        {
                           //sélection de zozor
                           if(event.button.y<100)
                           {
                            SDL_FreeSurface(zozor);
                            zozor= IMG_Load("zozor.bmp");
                            SDL_SetColorKey(zozor,SDL_SRCCOLORKEY,SDL_MapRGB(zozor->format,0,0,255));
     
                           }
                           //sélection de la girafe
                           if(event.button.y>100 && event.button.y<220)
                           {
                            SDL_FreeSurface(zozor);
                            zozor= IMG_Load("girgif.bmp");
                            SDL_SetColorKey(zozor,SDL_SRCCOLORKEY,SDL_MapRGB(zozor->format,0,0,255));
                           }
                           //effacer la zone de dessin
                           if(event.button.y>420 && event.button.y<492)
                           {
                                SDL_BlitSurface(fond,NULL,ecran,&pos_fond);
                           }
                           //quitter le programme 
                           if(event.button.y>496 && event.button.y<577)
                           {
                               continuer=0;
                           }
                        }
                       pos_zozor->x=event.button.x-(zozor->w/2);
                       pos_zozor->y=event.button.y-(zozor->h/2);
                    break;
                    default:
                    break;
                }
              break;
              default:
              break;
            }
     
     
            if(pos_zozor->x >100 && pos_zozor->y >-1 && pos_zozor->x<ecran->w && pos_zozor->y < ecran->h)
            {
            SDL_BlitSurface(zozor,NULL,ecran,pos_zozor);
            }
            SDL_Flip(ecran);
        }
    }

  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 : 43
    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 faut changer pas mal de choses dans ton code. Il est mal écrit et pas du tout performant.

    Déjà, il faut modifier la facon dont les choses sont faites :

    - Il faut tester le retour de SDL_PollEvent;
    - Il faut arrêter de dessiner zozor à chaque itération sauf si un bouton a été appuyé;
    - Ce n'est pas la peine d'avoir du double Buffering mais si tu l'as faut être sûr de ce que tu fais...

    Du coup, faudra au début :

    - Dessiner le fond sur la première image
    - Flip
    - Dessiner sur la deuxième image
    - Flip

    Ensuite faire ton rendu avec les zozor et les giraffes...

    - Ne pas charger les images à chaque fois mais plutôt les charger tous une fois avant le début et juste changer le pointeur

    - Pour effacer :
    1) Effacer premiere image
    2) Flip
    3) Effacer deuxieme image
    4) Flip

    - tester le retour des chargements d'images

    Enfin, ton code tourne chez moi sans codeblocks donc je ne sais pas pourquoi tu as un problème.

    Jc

  3. #3
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    dans les options de ton projet tu as bien mis mode GUI?

  4. #4
    Membre régulier Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Points : 101
    Points
    101
    Par défaut
    Merci pour les réponses . Je donne des nouvelles quand j'aurai débrouissaillé mon code.

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/06/2007, 11h34
  2. Problème de JTree dans un exécutable
    Par amelA dans le forum Composants
    Réponses: 2
    Dernier message: 21/04/2007, 23h32
  3. Problème de démarage après partitionnement
    Par darkozz dans le forum Windows XP
    Réponses: 8
    Dernier message: 08/07/2006, 18h10
  4. Problème de démarage ( SYSTEMBOOT\...\SECURITY )
    Par zodd dans le forum Ordinateurs
    Réponses: 4
    Dernier message: 01/12/2005, 11h46
  5. Problème au démarage du PC
    Par Frazeks dans le forum Windows XP
    Réponses: 25
    Dernier message: 25/11/2005, 23h24

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