Partage
  • Partager sur Facebook
  • Partager sur Twitter

Gestion des évènement

Possible de la mettre sous fonction et de l'appeler dans le main ?

    16 octobre 2021 à 21:57:49

    Bonjour, je reviens vers vous car je n'arrive pas à trouver une solution pour utiliser les évènements en fonction(d'ailleurs, je ne sais pas si c'est possible...)

    De plus je vous transmet mon code, car depuis que j'ai transféré les évènements clavier dans la fonction main.c , je n'ai plus de visuel sur l'image PNG du tank, alors qu'en fonction je l'avais...

    Je recherche pourquoi, peut être que je n'y arrive plus parce-que j'ai été dessus toute la journée et que mon cerveau est en train de griller.

    Voila le code :

    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL.h>
    #include <SDL_image.h>
    #include "main.h"
    
    int main(int argc, char *argv[])
    {
    /* INITIALISATION */
        int statut = EXIT_FAILURE;
        SDL_bool quit = SDL_FALSE;
    
        SDL_Window *window = NULL;
        SDL_Renderer *render = NULL;
        SDL_Surface *screen = NULL;
    
        if(Init(&window, &render, &screen, LARGEUR, HAUTEUR) != 0)
            goto Quit;
                SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format,40,0,0));
                SDL_UpdateWindowSurface(window);
        if(0 > load_logo("images/logo.bmp", window))
            goto Quit;
    
        SDL_Rect position;
        pos_init(&position);
    
    /* KEYBOARD USER & SURFACE ACTUALIZATION */
    
            SDL_Event event;
    
            int up = 0, down = 0, right = 0, left = 0;
            while(!quit)
            {
                SDL_PollEvent(&event);
                SDL_UpdateWindowSurface(window);
                switch(event.type)
                {
                case SDL_QUIT:
                    quit = SDL_TRUE;
                    break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                    case SDLK_UP:
                        up = 1;
                        break;
                    case SDLK_DOWN:
                        down = 1;
                        break;
                    case SDLK_RIGHT:
                        right = 1;
                           break;
                    case SDLK_LEFT:
                        left = 1;
                        break;
                    }
                    break;
                case SDL_KEYUP:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_UP:
                        up = 0;
                        break;
                    case SDLK_DOWN:
                        down = 0;
                        break;
                    case SDLK_RIGHT:
                        right = 0;
                           break;
                    case SDLK_LEFT:
                        left = 0;
                        break;
                    }
                    break;
                SDL_Delay(35);
                SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format,40,0,0));
                usr_pos(&position, &up, &down, &right, &left);
    
                if(0 > user_tank("images/tank_r_2.png", window, screen, position))
                    goto Quit;
    
                SDL_UpdateWindowSurface(window);
                }
            }
    
        /* EXIT PROGRAM */
        SDL_FreeSurface(screen);
        statut = EXIT_SUCCESS;
    Quit:
        destroy_all(&window,&render);
        SDL_Quit();
        return statut;
    /* END MAIN.C */
    }
    
    int user_tank(const char path[], SDL_Window *window, SDL_Surface *screen, SDL_Rect position)
    {
        SDL_Surface *tank = NULL;
    
        tank = IMG_Load(path);
        if (NULL == tank)
        {
            fprintf(stderr, "Erreur chargement texture tank : %s", SDL_GetError());
            return -1;
        }
        SDL_BlitScaled(tank, NULL, screen, &position);
        SDL_UpdateWindowSurface(window);
        return 0;
    }
    
    int load_logo(const char path[], SDL_Window *window)
    {
        SDL_Surface *logo = NULL;
        logo = IMG_Load(path);
        if(NULL == logo)
        {
            fprintf(stderr, "Erreur logo : %s", SDL_GetError());
            return -1;
        }
        SDL_SetWindowIcon(window, logo);
        SDL_FreeSurface(logo);
        return 0;
    }
    
    void usr_pos(SDL_Rect *position, int *up, int *down, int *right, int *left)
    {
        if (up)
        {position->y -= 5;}
        if (down)
        {position->y += 5;}
        if (right)
        {position->x += 5;}
        if (left)
        {position->x -= 5;}
    
    }
    
    void pos_init(SDL_Rect *position)
    {
        position->x = INIT_X;
        position->y = INIT_Y;
        position->w = INIT_W;
        position->h = INIT_H;
    }
    
    int destroy_all(SDL_Window **window, SDL_Renderer **render)
    {
        if (NULL != *render)
            SDL_DestroyRenderer(*render);
        if (NULL != *window)
            SDL_DestroyWindow(*window);
        return 0;
    }
    
    int Init(SDL_Window **window, SDL_Renderer **render, SDL_Surface **screen, int largeur, int hauteur)
    {
        *window = SDL_CreateWindow("Torq", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, largeur, hauteur, SDL_WINDOW_SHOWN);
        if (NULL == *window)
        {
            fprintf(stderr, "Erreur init window : %s", SDL_GetError());
            return -1;
        }
    
        *render = SDL_CreateRenderer(*window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
        if (NULL == *render)
        {
            fprintf(stderr, "Erreur init render : %s", SDL_GetError());
            return -1;
        }
    
        *screen = SDL_GetWindowSurface(*window);
        if (NULL == *screen)
        {
            fprintf(stderr, "Erreur init screen : %s", SDL_GetError());
            return -1;
        }
        return 0;
    }
    

    Header :

    #ifndef MAIN_H_INCLUDED
    #define MAIN_H_INCLUDED
    
    /* SCREEN DIMENSIONS */
    #define HAUTEUR 864
    #define LARGEUR 1024
    #define SCREEN_RESOLUTION_W 1920
    #define SCREEN_RESOLUTION_H 1080
    
    /* TANK TEXTURE DIMENSIONS */
    #define TANK_W 75
    #define TANK_H 85
    
    /* TANKS POSITIONS CONSTANT VALUES */
    #define INIT_X 100
    #define INIT_Y 100
    #define INIT_W TANK_W
    #define INIT_H TANK_H
    typedef struct usr_guide usr_guide;
    struct usr_guide
    {
        int up;
        int down;
        int right;
        int left;
    };
    usr_guide moove;
    
    int Init(SDL_Window **window, SDL_Renderer **render, SDL_Surface **screen, int largeur, int hauteur);
    int destroy_all(SDL_Window **window, SDL_Renderer **render);
    int load_logo(const char path[], SDL_Window *window);
    
    void pos_init(SDL_Rect *position);
    void usr_pos(SDL_Rect *position, int *up, int *down, int *right, int *left);
    
    int user_tank(const char path[], SDL_Window *window, SDL_Surface *screen, SDL_Rect position);
    
    #endif // MAIN_H_INCLUDED

    Bon vous verrez des vestiges de mes tentatives pour créer une fonction des évènement clavier afin de l'utiliser dans le main (comme la structure usr_guide qui n'est plus utilise dans le code actuel (mais que je garde encore néanmoins.)

    Avec ce code, je n'ai plus le tank qui s'affiche, est-ce que vous pouvez m'aider à ce sujet ? 

    J'ai tenté, de remodeler le code en enlevant certaines fonctions , etc etc, mais la j'avoue que j'aurai surment besoin d'un coup de pouce.

    P.S: Mon petit doigt me dit que mon problème me viens des pointeurs... peut être pas.

    EDIT : Le de Build log m'indique ni erreur ni avertissement. 

    -
    Edité par Torq 16 octobre 2021 à 22:01:57

    • Partager sur Facebook
    • Partager sur Twitter
      26 octobre 2021 à 11:38:30

      je regarde rapidement ton code et un truc me chagrinne :
      void usr_pos(SDL_Rect *position, int *up, int *down, int *right, int *left)
      {
          if (up)
          {position->y -= 5;}
          if (down)
          {position->y += 5;}
          if (right)
          {position->x += 5;}
          if (left)
          {position->x -= 5;}
       
      }
      tu demande des pointeur (ce qui n'est pas utile) et tu regarde pas leur valeur mais si on t'as bien donnée des pointeurs... en gros tu passe dans tous tes tests y-5, y+5, x+5, x-5 ce qui revient à faire 0

      dans ton cas la fonction devrait s'ecrire comme ça :
      si tu garde les pointeurs
      void usr_pos ( SDL_Rect *position, const int * const up, const int * const down, const int * const right, const int * const left )
      {
          if ( up && *up )
          {
              position->y -= 5;
          }
          if ( down && *down )
          {
              position->y += 5;
          }
          if ( right && *right )
          {
              position->x += 5;
          }
          if ( left && *left )
          {
              position->x -= 5;
          }
      }
      on paye pas les espaces alors autant rendre ton code plus facile à lire, dans le prototype j'ai rajouté les consts car ters variables ne sont la que pour etre lu donc autant les placer en const, et dans les if tu verifie que le pointeur est valide puis tu verifie qu'il pointe pas sur un zero

      mais dans ton cas un fonction sans pointeur aurai parfaitement fonctionné

      Edit : pour rappel :
      int var = 1;
      
      int *pVar = &var;
      
      // pVar = adresse en memoire de var
      // *pVar = valeur contenue à l'adresse de var (donc la valeur de var)
      // if ( pVar ) = tu test si pVar pointe vient sur une variable et donc si le pointeur a été initialisé



      -
      Edité par ox223252 26 octobre 2021 à 11:42:51

      • Partager sur Facebook
      • Partager sur Twitter

      la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

      Mon GitHub

        26 octobre 2021 à 14:39:53

        ox223252 a écrit:

        void usr_pos ( SDL_Rect *position, const int * const up, const int * const down, const int * const right, const int * const left )
        {
            if ( up && *up )
            {
                position->y -= 5;
            }
            if ( down && *down )
            {
                position->y += 5;
            }
            if ( right && *right )
            {
                position->x += 5;
            }
            if ( left && *left )
            {
                position->x -= 5;
            }
        }

        Les yeux m'en tombent. Par rapport au style :

        • Pourquoi mettre des espaces avant et après l'étoile ? On dirait visuellement une multiplication, ce qui rend la lecture difficile
        • Rajouter const partout, surtout pour des variables locales ou paramètres passés par valeur, ça alourdit énormément la lecture des paramètres, pour absolument aucun bénéfice (votre chat ne va pas sur le clavier modifier par erreur les variables que je sache), et pire que ça, certains, en voyant des variables "const" lors d'une session de débugage, se disent inconsciemment "cette variable ne peut pas être modifié" et font le raccourci foireux de dire "le problème ne vient pas de là", donc on peut passer à côté du vrai bug. Et quand on lit du code, il faut comprendre le code, ce qu'il fait, etc, et pas se demander si "il est possible de modifier telle ou telle variable", ça c'est quelque chose qu'on voit directement quand on lit l'algorithme.
        • Il ne faut pas mettre d'espace après une parenthèse ouvrante ou avant une parenthèse fermante. Non ça ne facilite pas la lecture, au contraire. En faisant ça, vous placez le contenu du groupe (délimité par les parenthèses) à égale distance de tout ce qu'il y a autour ! Et donc on perd la notion visuelle de "regroupement"
        Et par rapport à la fonction en elle-même, bien évidemment qu'il ne faut pas utiliser de pointeurs. Il faut passer directement les int :
        void usr_pos(SDL_Rect *position, int up, int down, int right, int left)
        {
            if (up)    position->y -= 5;
            if (down)  position->y += 5;
            if (right) position->x += 5;
            if (left)  position->x -= 5;
        }
        Là si j'avais mis des const partout ça serait beaucoup moins lisible puisque on voit en un coup d'oeil toute la fonction et on n'a pas besoin de se demander, lors de la relecture, si les variables "peuvent être modifiées". Et quand bien même elles auraient été modifiées, ça reste dans le cadre de cette fonction, et ça ne va pas affecter qui que ce soit d'autre (ce qui ne serait pas le cas avec des pointeurs, pour lesquels le premier const avant l'étoile se justifie)
        Voilà c'est tout pour moi n'oubliez pas de vous abonner et laisser un pouce bleu :)


        -
        Edité par JadeSalina 26 octobre 2021 à 14:41:54

        • Partager sur Facebook
        • Partager sur Twitter
          26 octobre 2021 à 15:20:24

          Il y a plusieurs points qui ne vont pas :

          - Tu te casses la tête avec des pointeurs sur pointeur, inutile

          - Tu mélanges SDL1 et SDL2 en travaillant avec des SDL_Surface et un SDL_Renderer qui est ici inutile du coup

          - Tu charges une image dans ta boucle principale, chose à éviter

          - Les goto sont à éviter également

          Je te conseille ce cours si tu veux travailler efficacement avec SDL2 :

          https://zestedesavoir.com/tutoriels/1014/utiliser-la-sdl-en-langage-c/

          • Partager sur Facebook
          • Partager sur Twitter
            27 octobre 2021 à 10:52:02

            KevinGL a écrit:

            KevinGL a écrit:

            Il y a plusieurs points qui ne vont pas :

            - Tu te casses la tête avec des pointeurs sur pointeur, inutile

            - Tu mélanges SDL1 et SDL2 en travaillant avec des SDL_Surface et un SDL_Renderer qui est ici inutile du coup

            - Tu charges une image dans ta boucle principale, chose à éviter

            - Les goto sont à éviter également

            Je te conseille ce cours si tu veux travailler efficacement avec SDL2 :

            https://zestedesavoir.com/tutoriels/1014/utiliser-la-sdl-en-langage-c/


            Dans le cas de gestion d'erreur, c'est une méthode propre. ça aide a assurer que toute les ressources allouées sont libérées, et ceux à un seul endroit.


            Les pointeurs sur pointeurs ne sont inutiles dans sa fonction init. Et ça va, gérer deux niveaux de pointeurs, c'est pas la mort, faut arréter avec le "les pointeurs c'est dur".

            • Partager sur Facebook
            • Partager sur Twitter
            Si vous ne savez pas quoi faire, ne faites rien !
              27 octobre 2021 à 11:05:04

              Pourquoi faire simple quand on peut faire compliqué ... Pour moi le fait que le PO utilise des pointeurs sur pointeur prouve que qqchose lui échappe : On a déjà un pointeur sur SDL_Window donc autant l'utiliser pour modifier les paramètres de la fenêtre, c'est fait pour ça. On ne cherche pas à modifier le pointeur lui-même mais ce sur quoi il pointe.

              -
              Edité par KevinGL 27 octobre 2021 à 12:03:10

              • Partager sur Facebook
              • Partager sur Twitter
                27 octobre 2021 à 12:10:53

                Et comme il ne pointe sur rien, puisqu'initialisé à... NULL, il faut faire en sorte qu'il pointe quelque part. Donc on modifie le pointeur.
                • Partager sur Facebook
                • Partager sur Twitter
                Si vous ne savez pas quoi faire, ne faites rien !
                  27 octobre 2021 à 15:03:34

                  Oui tu as raison en fait
                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 novembre 2021 à 10:48:19

                    JadeSalina a écrit:

                    • Pourquoi mettre des espaces avant et après l'étoile ? On dirait visuellement une multiplication, ce qui rend la lecture difficile
                    • Rajouter const partout, surtout pour des variables locales ou paramètres passés par valeur, ça alourdit énormément la lecture des paramètres, pour absolument aucun bénéfice (votre chat ne va pas sur le clavier modifier par erreur les variables que je sache), et pire que ça, certains, en voyant des variables "const" lors d'une session de débugage, se disent inconsciemment "cette variable ne peut pas être modifié" et font le raccourci foireux de dire "le problème ne vient pas de là", donc on peut passer à côté du vrai bug. Et quand on lit du code, il faut comprendre le code, ce qu'il fait, etc, et pas se demander si "il est possible de modifier telle ou telle variable", ça c'est quelque chose qu'on voit directement quand on lit l'algorithme.
                    • Il ne faut pas mettre d'espace après une parenthèse ouvrante ou avant une parenthèse fermante. Non ça ne facilite pas la lecture, au contraire. En faisant ça, vous placez le contenu du groupe (délimité par les parenthèses) à égale distance de tout ce qu'il y a autour ! Et donc on perd la notion visuelle de "regroupement"
                    bon alors tu ne dois pas savoit a quoi sert le const car ça sert aussi au compilateur, et oui c'est utile de savoir ce qui est censé changer ou non... mais bon, quand au style d'ecriture si tu trouve des multiplication dans une declaration de fonction tu peux m'appeller :'(, et enfin les parenthaises avec ou sans espace, ce n'est que de la convention donc calme toi, chez nous on utilise cette notation et personne ne c'est jamais trompé donc tu es peut etre un peu trop sensible.

                    JadeSalina a écrit:


                    Et par rapport à la fonction en elle-même, bien évidemment qu'il ne faut pas utiliser de pointeurs. Il faut passer directement les int :
                    void usr_pos(SDL_Rect *position, int up, int down, int right, int left)
                    {
                        if (up)    position->y -= 5;
                        if (down)  position->y += 5;
                        if (right) position->x += 5;
                        if (left)  position->x -= 5;
                    }
                    Là si j'avais mis des const partout ça serait beaucoup moins lisible puisque on voit en un coup d'oeil toute la fonction et on n'a pas besoin de se demander, lors de la relecture, si les variables "peuvent être modifiées". Et quand bien même elles auraient été modifiées, ça reste dans le cadre de cette fonction, et ça ne va pas affecter qui que ce soit d'autre (ce qui ne serait pas le cas avec des pointeurs, pour lesquels le premier const avant l'étoile se justifie)

                    -

                    Edité par JadeSalina 26 octobre 2021 à 14:41:54

                    et apres avoir ecrit ce code tu critique mon style ? des blocs de codes non definis par des acolades ? mais ça fait combient de temps que tu code ? quand je faisiat ça a mes debut je me faisais passer un savont par n'importe quel codeur. je sais pas pour qui tu code, mais ça ne suis aucune regles de qualité logiciel qui soit un peu exigente. bref avant de chercher la paille chez le voisin regarde la poutre que tu as dans ton oeil.

                    pour info l'idée qu'on peut voir d'un silmple coup d'oeil si les variables peuvent etre modifier, c'est pas valide comme argument, car les bugs trouvent toujours leur source dans l'interface cahise clavier.

                    -
                    Edité par ox223252 4 novembre 2021 à 10:50:45

                    • Partager sur Facebook
                    • Partager sur Twitter

                    la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

                    Mon GitHub

                      4 novembre 2021 à 13:04:04

                      ox223252 a écrit:

                      et apres avoir ecrit ce code tu critique mon style ? des blocs de codes non definis par des acolades ?


                      Je suis d'accord, vous noterez que j'ai mis l'instruction sur la même ligne que le if, et non pas à la ligne suivante sans accolades, ce qui est absolument abjecte. Là vu qu'il n'y a qu'une instruction et que les 4 sont finalement assez similaires, on peut les voir comme ça d'un coup d'oeil sur la même ligne sans avoir à scroller son écran.

                      Et les const pour les paramètres genre "const int foo" ou "int *const foo" je ne sais pas dans quel monde ça facilite la lecture ou apporte quelque information que ce soit. Mais à la limite chacun son truc pourquoi pas. Mais par contre pourquoi le laisser dans les interfaces publiques (dans les .h) ? Qu'es-ce que l'utilisateur en a à faire que la fonction ne va pas modifier son paramètre passé par valeur ? Vous avez déjà vu des documentation où les paramètres sont spécifiés const ? L'utilisateur veut juste savoir si l'objet pointé va être modifié ou pas, mais pas les autres paramètres passés par valeur

                      -
                      Edité par JadeSalina 4 novembre 2021 à 13:33:56

                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 novembre 2021 à 13:29:39

                        JadeSalina : en terme de facilité de lecture, pour moi ce que tu as fait est top. (Et puis je ne suis pas très partisan des règles dogmatiques. J'ai cru comprendre que dans un contexte professionnel il y a souvent des règles strictes, mais je me suis inscrit du temps du Site du Zéro et j'ai du mal à considérer que les discussions de ce forum doivent concerner uniquement le contexte professionnel.)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 novembre 2021 à 13:57:04

                          Le style est important, dans un contexte pro ou non. L'indentation, comment et où on place la ponctuation, la cohérence dans le nommage, le découpage du code … tout ça permet non seulement d'éviter certaines fautes à la con, mais facilite grandement la lecture.
                          Nous le faisons tous lorsque nous écrivons, du code ou non.

                          De plus, les éditeurs modernes proposent tous des facilités de mise en forme ; ce serait bête,surtout lorsqu'on débute et que l'on doit aussi prendre quelques bonnes habitudes, de s'en priver.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 novembre 2021 à 16:01:12

                            JadeSalina a écrit:

                            Je suis d'accord, vous noterez que j'ai mis l'instruction sur la même ligne que le if, et non pas à la ligne suivante sans accolades, ce qui est absolument abjecte.


                            Alors je code de manière abjecte, car j'écris

                            if(....)
                                a=b;
                            else
                                a=c;


                            Edit: et dans le contexte où tu l'écris, abject ne prend pas de e

                            -
                            Edité par edgarjacobs 4 novembre 2021 à 16:07:25

                            • Partager sur Facebook
                            • Partager sur Twitter

                            On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                              4 novembre 2021 à 16:09:34

                              edgarjacobs a écrit:

                              JadeSalina a écrit:

                              Je suis d'accord, vous noterez que j'ai mis l'instruction sur la même ligne que le if, et non pas à la ligne suivante sans accolades, ce qui est absolument abjecte.


                              Alors je code de manière abjecte, car j'écris

                              if(....)
                                  a=b;
                              else
                                  a=c;

                              -
                              Edité par edgarjacobs il y a 2 minutes

                              Ah mince désolée x) Après selon les gouts et les couleurs chacun fait ce qu'il veut mais si on le met sur sa propre ligne sans accolades et que tout d'un coup on veut rajouter une instruction, il va falloir penser implicitement à rajouter des accolades alors que si c'est sur la même ligne ça saute aux yeux qu'il faut rajouter les accolades

                              • Partager sur Facebook
                              • Partager sur Twitter
                                4 novembre 2021 à 16:24:21

                                Pardonnée :)

                                Et oui, il faut penser, mais je crois que la plupart d'entre nous est équipé pour....

                                -
                                Edité par edgarjacobs 4 novembre 2021 à 16:28:08

                                • Partager sur Facebook
                                • Partager sur Twitter

                                On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                  4 novembre 2021 à 17:17:05

                                  Le plus simple reste le OTBS, le one true brace style ^_^ avec un tab stop de 4 fait d'espaces.

                                  Du coup, même si on est équipé pour, on pourra utiliser cette ressource pour des choses plus importantes.

                                  Enfin je ne sais pas pour vois, mais le style est un automatisme en ce qui me concerne, limite un réflexe.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    4 novembre 2021 à 17:31:54

                                    Je pense que le style d'écriture du code ne dépend que du codeur (ou de la société pour laquelle il travaille). wikipédia en recence déjà pas mal, mais il y a les manières personnelles d'écrire le code. Tant que la chatte y retrouve ses chatons, c'est bon.

                                    Et pour moi aussi, le style est un automatisme.

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                    Gestion des évènement

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown