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 :

SDL pas de filtrage.


Sujet :

SDL

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Points : 40
    Points
    40
    Par défaut SDL pas de filtrage.
    Bonjour,
    Voila mon problème est que lorsque je veut faire un filtrage sur un SDL_Event, celui se fiche de mon filtre et il rentre dans tous les cas:
    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
     
     SDL_Event     event;
     
      SDL_PollEvent(&event);
      if (this->field.all != NULL)
        {
          aff_map(this);
          switch(event.type)
            {
            case SDL_QUIT:
              printf("%d\n", SDL_QUIT);
              //this->end = 1;                                                                         
              break;
            case SDL_MOUSEMOTION:
              printf("jv\n");
              aff_food(this, (int)event.motion.x, (int)event.motion.y);
              break;
            case SDL_KEYDOWN:
              printf("jv\n", SDL_QUIT);
              this->time_key++;
              if (this->time_key >= 10)
                {
                  this->time_key = 0;
                  switch (event.key.keysym.sym)
                    {
                    case SDLK_UP:
                      this->y_cam -= IMG;
                      break;
                    case SDLK_DOWN:
                      this->y_cam += IMG;
                      break;
                    case SDLK_RIGHT:
                      this->x_cam += IMG;
                      break;
                    case SDLK_LEFT:
                      this->x_cam -= IMG;
                      break;
                    }
                }
            }
    Dans le code ci-dessus, ça va rentrer dans tous les cas et donc m'afficher les jv et le printf du SDL_QUIT.

  2. #2
    Membre à l'essai
    Homme Profil pro
    stagiaire en informatique
    Inscrit en
    Août 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : stagiaire en informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    quand tu parles du filtre, je suppose que tu parles de ton if(this->time_key >= 10) ou bien de ton tout premier if ?

    Peux tu mettre une plus grosse partie de ton code car je ne pense pas que le problème vienne de cette partie que tu nous montre et on ne voit pas à quoi correspond exactement ta structure.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Points : 40
    Points
    40
    Par défaut
    Non je parle en fait des case. cette fonction est appellé à chaque tour de boucle de cette fonction:
    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
     
    int             main(int ac, char **av)
    {
      char          *cmd;
      char          **list_cmd;
      Game          *this;
      int           i = 0;
      int           p_ac;
      fd_set        rfds;
      struct        timeval tv;
      int           retval;
      char          *bufi;
      int           l;
     
      if (ac != 3)
        return (-1);
      bufi = malloc(1000);
      bufi[900] = 0;
      this = malloc(sizeof(Game));
      init_game(this);
      this->sock = get_socket(av[2], av[1]);
      Vbuff(bufi);
      printf("%d\n", this->sock);
      while (this->end == 0)
        {
          tv.tv_sec = 0.02;
          tv.tv_usec = 0;
          list_cmd = NULL;
          FD_ZERO(&rfds);
          FD_SET(this->sock,&rfds);
          retval = select(6, &rfds, NULL, NULL, &tv);
          Vbuff(bufi);
          if (retval)
            {
              if (recup_cmd(this->sock,bufi) == 0)
                {
                  bufi[strlen(bufi)-1] = 0;
                  list_cmd = Cut_cmd(bufi);
                  Vbuff(bufi);
                }
            }
          if (list_cmd != NULL)
            {
              i = 0;
              p_ac = 0;
              while (list_cmd[p_ac])
                p_ac++;
              while (list[i].name != NULL)
                {
                  if (strcmp (list[i].name,list_cmd[0]) == 0 && p_ac-1 == list[i].argc)
                    list[i].func(p_ac,list_cmd,this);
                  i++;
                }
            }
          aff_all(this);
        }
      printf("%d\n", this->end);
      SDL_Quit();
      return (0);
    }
    Ensuite il y à cette fonction que je cité lors de mon premiers message:
    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
     
    void            aff_all(Game *this)
    {
      SDL_Event     event;
     
      event.type = 0;
      SDL_PollEvent(&event);
      if (this->field.all != NULL)
        {
          aff_map(this);
          switch(event.type)
            {
            case SDL_QUIT:
              this->end = 1;
              break;
            case SDL_KEYDOWN:
              this->time_key++;
              if (this->time_key >= 10)
                {
                  this->time_key = 0;
                  switch (event.key.keysym.sym)
                    {
                    case SDLK_UP:
                      this->y_cam -= IMG;
                      break;
                    case SDLK_DOWN:
                      this->y_cam += IMG;
                      break;
                    case SDLK_RIGHT:
                      this->x_cam += IMG;
                      break;
                    case SDLK_LEFT:
                      this->x_cam -= IMG;
                      break;
                    }
                }
            }
          aff_food(this, (int)event.motion.x, (int)event.motion.y);
          aff_egg(this);
          aff_dead(this);
          aff_player(this);
          aff_pondaison(this);
          SDL_Flip(this->ecran);
        }
    }
    J'ai d'autre fonction mais je ne pense pas que cela est un rapport.
    Si vous voulez les autres vous me le dites mais c'est simplement des blitsurface.
    Mon affichage n'est pas top non plus, il y à des parties qui s'affiche de façcon saccadé.
    J'ai également remarqué que lorsque je sort de ma fenêtre le event.motion.x et y se mettait à 0.

  4. #4
    Membre à l'essai
    Homme Profil pro
    stagiaire en informatique
    Inscrit en
    Août 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : stagiaire en informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Alors, plusieurs remarques, ça sert a quoi de malloc buffi à 1000 si c'est pour mettre un \0 à 900 ?
    De plus tu devrais vérifier le retour de tes malloc ... On se sait jamais ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(!(buffi = malloc(1000)))
        exit(0);
    Après pour le fait de rentrer dans tous tes case, essaye de ne pas mettre ton event.type à 0 juste avant de rentrer dans ta boucle ?

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Points : 40
    Points
    40
    Par défaut
    Le malloc de 1000 c'est juste que j'aime bien allouer un plus que se que j'ai besoin^^.
    Si je ne met pas event.type à 0 c'est pire parseque ça rentre dans le case SDL_QUIT et donc ça ferme direct.

  6. #6
    Membre à l'essai
    Homme Profil pro
    stagiaire en informatique
    Inscrit en
    Août 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : stagiaire en informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Ok mais du coup je pencherai plus pour un problème qui vient de la façon dont tu catch tes events que comment tu les traite .

    Pour le fait d'allouer plus que ce que tu as besoin, que tu aimes ... hum ... peut-être mais ça ne sert a rien. Sauf a pomper plus que nécessaire et ça ne fera pas moins planter ton code si il est bien construit. Je ne sais pas si tu débutes ou pas mais si tu tiens a faire du beau code ne fait surtout pas ça. Après si tu t'en fou ben ........

    D'ailleurs je viens de tilter, je ne m'y connais pas trop en SDL, mais ou est-ce que tu hook tes events, il ne me semble pas voir de hook.

    Je ne connaissais pas SDL_pollevent, mais d'apres ce que j'ai compris, ca traite les messages qui sont dans une file mais en aucun cas ca ne les récupère.

  7. #7
    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
    Je connais bien la SDL donc je vais répondre pour aider mais oui SDL_PollEvent(&event); permet de récupérer les évents.
    Après il faut juste faire des 'if' pour savoir quel évènement est récupérer.

    Dans le code ci-dessus, ça va rentrer dans tous les cas et donc m'afficher les jv et le printf du SDL_QUIT.
    Ah bon ça rentre alors que tu clique pas sur le bouton quitter de la fenêtre ? et sans faire aucun event ?
    Je vois pas si la SDL a été initialisé , si elle est pas ça peut causer quelque bug.

    Sinon le truc qui me dérange le plus c'est le code , il est horrible. assez mal indenté , la logique du code est horrible tu met affichage dans les évènements , et il y a apparemment une grosse structure qui permet éviter les variable global c'est bien mais la structure me semble plus un foutoir qu'autre chose.

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Points : 40
    Points
    40
    Par défaut
    Le code est sale oui lol mais par contre mon affichage n'est pas dans les envent. Elle est dans la condition if (this->field.all != NULL).
    Je pense que le problème est assez compliqué, je pense que ça viendrais plutôt des socket car avant de mettre en place la couche réseau je n'avait pas ce problème.

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut
    Bonjour shirohige,

    A chaque fois la que la fonction aff_all() est appelée, on passe la ligne :

    7 SDL_PollEvent(&event);

    même si aucun évènement ne s'est produit et, si aucun évènement ne s'est produit, event.type n'est bien sur pas mis à jour.

    Le switch (ce que tu appelles le filtre) aiguille alors toujours les case sur le dernier évènement du passé (le plus courant est un mouvement de souris).

    Par contre es-tu vraiment certain de passer dans le case SDL_QUIT:
    sans avoir cliquer sur la fermeture ?

    Quoi qu'il en soit pour gérer correctement les évènements il est obligatoire de gérer le retour de la fonction "int SDL_PollEvent(SDL_Event* event)" dans une boucle while.

    voir http://loka.developpez.com/tutoriel/sdl/evenements/

Discussions similaires

  1. [XL-2007] Filtre avancé : pas de filtrage ?
    Par laurentSc dans le forum Excel
    Réponses: 10
    Dernier message: 22/05/2014, 14h06
  2. Console + SDL = pas terrible
    Par ironzorg dans le forum SDL
    Réponses: 43
    Dernier message: 25/04/2007, 21h08
  3. Tuto, les premiers pas en SDL
    Par Soward dans le forum SDL
    Réponses: 7
    Dernier message: 19/04/2007, 21h01
  4. Réponses: 7
    Dernier message: 16/05/2006, 19h12
  5. [Debutant] Sdl & OpenGl link ne marche pas
    Par Riko dans le forum OpenGL
    Réponses: 9
    Dernier message: 18/02/2004, 16h13

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