Partage
  • Partager sur Facebook
  • Partager sur Twitter

Action RPG en 2D en C avec SDL et FMOD

Sujet résolu
    14 décembre 2009 à 13:53:14

    int Collide(SDL_Rect* m,SDL_Rect* n)
    {
    	if((m->x >= n->x + n->w) 
    	|| (m->x + m->w <= n->x) 
    	|| (m->y >= n->y + n->h) 
    	|| (m->y + m->h <= n->y) 
    	) 
    	return 0; 
       return 1; 
    }
    


    dit moi, fvirtman, comment marche cette fonction ? (je veux surtout dire "que signifie w et h :) )
    j'aimerait bien l'utiliser, mais au lieu de regarder si ca touche, regarder de quel coter touche (bas, droite, haut ou gauche). j'ai essayer de mettre uniquement "if((m->x >= n->x + n->w) " mais ca ne marchais pas. pourrait-tu m'expliquer le fonctionnement de cette fonction, afin que je puisse l'utiliser ?

    Merci !
    • Partager sur Facebook
    • Partager sur Twitter
      14 décembre 2009 à 13:58:28

      w et h sont des champs de SDL_Rect.
      Toujours avoir la doc sous la main :
      http://www.libsdl.org/cgi/docwiki.cgi/SDL_API

      Regarde SDL_Rect :
      http://www.libsdl.org/cgi/docwiki.cgi/SDL_Rect

      x,y = point supérieur gauche du rectangle, w = largeur, h = hauteur, avec ça, tu définis exactement un rectangle.

      La fonction veut littéralement dire :
      - si tu es trop a droite
      OU
      - si tu es trop a gauche
      OU
      - si tu es trop en bas
      OU
      - si tu es trop en haut

      ALORS tu ne touches PAS

      Sinon tu touches.

      Donc si tu veux savoir de quel coté tu touches, tu ne peux pas isoler une de ces conditions, car il y a collision que si les 4 sont fausses :)

      Il faut donc refaire une fonction qui va faire d'autres if.
      Typiquement, si ça touche (donc une fois Collide validé), et que la coordonnée X de droite (donc x+w) de la 1ere surface est > x de l'autre surface.

      Si j'ai le temps je te proposerai une fonction, mais sinon, ça se trouve sur papier :)
      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        14 décembre 2009 à 14:01:23

        Tu n'est pas dans le bon forum, il y a un forum "Présentation de tes projet".
        • Partager sur Facebook
        • Partager sur Twitter
          14 décembre 2009 à 14:07:51

          @fvirtman :

          mais pourquoi, quand je teste : "if(m->x >= n->x + n->w)" ca ne marche pas ?
          • Partager sur Facebook
          • Partager sur Twitter
            14 décembre 2009 à 14:11:49

            Analyse cette ligne :

            Elle te dit :
            Le bord gauche de m est plus éloigné que le bord droit de n

            Concretement, m et n ne se touchent pas, car m est a droite de n.
            • Partager sur Facebook
            • Partager sur Twitter

            Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

              14 décembre 2009 à 15:00:29

              j'ai bien compris ca, et justement, j'ai mis :
              if(m->x >= n->x + n->w)
              positon.x++;
              


              • Partager sur Facebook
              • Partager sur Twitter
                14 décembre 2009 à 15:13:52

                Image que le premier sprite va de 3 à 4, et le second de 5 à 9 : m->x = 3, n->x = 5, n->x + n->w = 9

                On passe pas dans ta condition, donc ça renvoie 1, alors que les deux sprites ne sont pas en collisions.
                • Partager sur Facebook
                • Partager sur Twitter
                  14 décembre 2009 à 15:35:34

                  quoi ? je croyait que ca se traduisait en "si ce n'est pas en colision" ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 décembre 2009 à 15:38:51

                    Ta condition, oui. C'est pour ça que j'ai dis "On passe pas dans ta condition"
                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 décembre 2009 à 15:42:30

                      ben oui, mais si tu lis bien ce que j'ai mis, c'est "si on n'est pas en collision, alors, on deplace le personnage"
                      • Partager sur Facebook
                      • Partager sur Twitter
                        14 décembre 2009 à 15:55:57

                        Effectivement, j'avais mal lu, mais ça ne change pas l'exemple : mes deux sprites ne sont pas en collisions, mais on ne passe pas dans ton if, donc le personnage ne se déplace pas. Parce que tu n'as pas pris tous les cas en compte.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 décembre 2009 à 16:02:32

                          oui, je sais, mais ce code est incomplet, c'est juste un exemple :)

                          bon, sinon, jay81, dit moi, je me trompe ou pour l'animation des personnage tu utilise une animation faite sur une grosse image ? car j'ai l'impression qu'il y a une barrière de 5 mètre autour des monstre.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            14 décembre 2009 à 21:30:02

                            Qu'est-ce que tu entends par grosse image ?
                            Tous mes sprites font 34x34pixels et l'animation se fait en changeant le sprite affiché en fonction de la direction et du temps.

                            S'il semble y avoir des "barrières" autour de certains monstres, c'est parce qu'en gros je teste la collision entre deux carrés, sauf que mes sprites ne sont pas carrés et certains remplissent plus ou moins le carré.

                            De fait, il peut y avoir collision entre les SDL_Surfaces, alors que l'oeil ne voit que les persos dedans et pas le carré transparent.

                            C'est un problème d'ajustage que je règlerai bientôt et qui est délicat car ça dépend des sprites qui entrent en collision et de leur position dans la SDL_Surface. (En gros, va falloir que je m'amuse à compter tous les pixels pour chaque monstre, en haut, en bas, à gauche et à droite, pour ajuster ma détection des collisions. :-°
                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 décembre 2009 à 10:17:15


                              Et hop !

                              Voilà une nouvelle mise à jour : http://www.rpgamer.fr :magicien:

                              Roswyn & The Dragons passe à la version 0.96 avec l'ajout de la forêt des rêves tordus et du donjon 4. La map du jeu fait maintenant près de 170 écrans !

                              Image utilisateur


                              Sinon, j'ai encore bossé le code (pour la version 0.97 :p ) et j'ai réduit l'écart dans la détection des collisions, maintenant, les combats sont plus rapprochés (je continue encore à tester avant la release). :pirate:

                              La version 0.97 contiendra aussi le nouveau village d'Affra et le pays pluvieux : avec un nouveau tileset, la pluie et le donjon 5. Mais ça fait du boulot (+ 70 levels à créer) !


                              A bientôt et bon jeu ! :p
                              • Partager sur Facebook
                              • Partager sur Twitter
                                16 décembre 2009 à 15:17:54

                                je confirme , chapeau , tu avance vite , et bien, en plus tu a commencée avec un projet ambitieux .

                                Si non je ne sais pas si c'est normal , mais le coter droit des arbre a une sorte de bout d'arbre en trop,comme s'il étais trop large.

                                En tout cas bonne continuation et bonne chance pour la suite.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  16 décembre 2009 à 15:33:56

                                  Merci pour vos encouragements ! :)

                                  J'avance toujours, là je suis en train de bosser sur le pays pluvieux, j'ai déjà rentré 14 levels mais il en fait une trentaine.
                                  Ensuite, il faut que je fasse le design du donjon 5 (forcément plus long et difficile que le 4), puis ensuite je compte rajouter le pays de Noël (enneigé), c'est la saison et le désert Chô. :soleil:

                                  Sinon pour les arbres, desquels parles-tu ? Pour certains, c'est vrai que c'est pas simple à dessiner car ils sont sur 2 ou 4 tiles (bonjour les raccords), surtout que Tile editor que j'utilise ne permet de dessiner les tiles qu'une par une... Si c'est juste un arbre, ça peut aussi être un bug, dans le dessin d'un level (dis-moi où si tu peux).

                                  Merci pour votre aide, à bientôt ! :D
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    16 décembre 2009 à 15:41:45

                                    par exemple les arbre boule ( les plus volumineux) sur la droite tu remarquera un décalage , rien de bien grave mais bon.
                                    En fait ton jeux me donne vraiment envie de me lancée dans un RPG , mais voila mon Courage ne suis pas mes envie ^^ , et puis j'ai un dont asses inexistant en 2D , et je me vois mal faire un RPG en 3d (bonjours les collision).

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      16 décembre 2009 à 15:42:24

                                      Bonjour

                                      Chapeau, faire ça en si peu de temps, c'est très bien.

                                      Par contre, en voyant le code, j'avoue que je n'aime pas l'organisation. Déjà : pas assez de fichier à mon gout. Tout est rassembler dans le main.c. Je pense qu'il aurait fallu classer tes fonctions en plusieurs fichiers, voire dossiers.

                                      Ensuite : plusieurs instructions sur une même ligne (et à quasiment chaque ligne), je trouve ça illisible.

                                      Du coup, j'ai vite abandonné la lecture, donc j'ai pas d'autres choses à reprocher.

                                      En tout cas, bravo.

                                      Edit : j'ai trouvé le courage de me replonger dans le code : je confirme, beaucoup de choses qui ne me plaise pas : redondance de code, code inutile, variables inutilisées (du moins je crois), etc... . Du code pas propre, en bref. Mais c'est pas à prendre mal, c'est juste moi qui aime pas, et ça n'enlève rien à la qualité du jeu.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        16 décembre 2009 à 18:01:47

                                        Oui c'est vrai, les arbres boule font partie de mon tout premier tileset, et je me suis arraché les cheveux dessus, en plus à ce moment-là, j'étais sous paint. Le résultat est plutôt pas mal comparé aux premiers essais :lol: mais c'est pas encore super. Je verrai si je peux les améliorer par la suite. Sinon, j'ai fait d'autres arbres pour le pays pluvieux et ils sont plutôt pas mal... A voir dans la prochaine release !

                                        Sinon, c'est bien que ça te donne envie de t'y mettre, mais c'est vrai que ça prend du temps. Pour l'instant, je ne fais plus que ça de mon temps libre... Quand j'aurai fini, je soufflerai un peu avant de me lancer dans le prochain projet :-° !

                                        Faudra que j'essaye la 3D aussi un de ces jours, mais j'y connais pas grand chose, va falloir que je bosse pas mal de tutos avant ;)
                                        surtout que j'ai encore mon C à parfaire ! :p

                                        @+
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          16 décembre 2009 à 18:26:13

                                          Je plussoie Pouf, quand j'ai compilé pour Linux, ma grande crainte était qu'une erreur m'empêche de créer un binaire et que je doive la rechercher partout dans ton code.

                                          Je pense que ce qui me déplaît dedans, c'est surtout l'indentation et certaines parties du code relativement peu utiles.
                                          Les variables globales, j'aime pas, mais pour ton projet je vois mal commment tu aurais pu t'en passer.
                                          Aussi, certains commentaires à des endroits évidents, alors que pour certaines parties plus difficiles à comprendre, un commentaire m'aurait bien aidé.

                                          Après, je suppose que tu n'espères pas que 36000 personnes se basent sur ton code, alors si il n'est pas non plus "parfait" c'est loin d'être gênant, tant que tu arrives à te comprendre :D

                                          Bonne continuation !
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            16 décembre 2009 à 19:11:48

                                            Citation : roibakura

                                            Les variables globales, j'aime pas, mais pour ton projet je vois mal commment tu aurais pu t'en passer.



                                            Alors théoriquement, on peut toujours se passer des variables globales :)
                                            Mais dans une moindre mesure, on peut faire UN pointeur global vers une structure ou on mettra tout ce qu'on veut "global" dedans.
                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                                              16 décembre 2009 à 20:13:45

                                              pour ma part pour mes teste (sous openGL sur tout) je bombarde mon code de variable globale , mais si ma fonction remplis sa fonction correctement une fois terminer , je recode plus proprement le tout , mais parfois elle peuve s'avère pratique .
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                16 décembre 2009 à 20:25:49

                                                Arriver à un tel résultat en si peu de temps, bravo...
                                                C'est une preuve de ténacité!

                                                Par contre, pour le moment tu as le nez dedans, pas de problèmes...
                                                Imagine, tu lâches ton projet quelques mois... Tu penses arriver encore à le faire évoluer si tu te replonges dedans ?

                                                Chapeau en tout cas, je n'ose même pas imaginer le travail pour rajouter des maps, etc... dans l'état actuel.

                                                Avant que ton jeu ne soit trop énorme, tu devrais, à mon avis, essayer de factoriser ce qui peux l'être. Tu gagneras du temps.

                                                Mais tu es la preuve qu'avec du boulot, on peut en après quelques mois, faire un RPG 2D.

                                                a+
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Zeste de Savoir, le site qui en a dans le citron !
                                                  16 décembre 2009 à 21:29:25

                                                  En fait, pour rajouter des maps, c'est pas si compliqué, car rien n'est codé dans le jeu. Il ne fait que lire 2 fichiers : niveaux.lvl et dataniveaux.lvl qui contiennent toutes les infos du jeu : le premier contient l'agencement des tiles et le deuxième toutes les infos sur l'état des monstres, des pnjs, des boss, des warps, des dialogues, du temps, etc...

                                                  Ces 2 fichiers ne font maintenant que 40ko pour 200 levels ! C'est fou mais en fait le jeu tient là-dedans. Leveleditor.exe permet de modifier ces 2 fichiers de façon rapide et fonctionnelle et rpg.exe ne fait que lire ces fichiers et exploiter les graphismes, les sons et les fichiers textes (.dialog).

                                                  Une fois que le code du jeu sera complètement terminé, ça sera donc possible de refaire un jeu avec de nouveaux persos et graphismes sans changer une ligne de code (comme je l'explique dans le tuto du level editor sur mon site). :magicien:

                                                  Maintenant, c'est vrai que se replonger dans un code des années après demande toujours des efforts. Je l'ai fait quand je programmais en RPL et ASM sur HP-48, mais là c'était pire car dans ce langage de programmation, un programme complexe (un jeu) est éclaté en une centaine de petits programmes, qu'on pourrait comparer à des fonctions du C, sauf qu'elles ont en plus le statut de variables-programmes o_O . Il n'y a donc pas de main mais plein de petits programmes qui s'appellent les uns les autres dans tous les sens. Pour s'y retrouver, c'est le bordel :p .

                                                  C'est pour ça aussi que mon main est aussi grand : pour une fois que je pouvais aligner autant de lignes de code à la suite, je me suis lâché :lol: !

                                                  @+
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    17 décembre 2009 à 12:05:27

                                                    Salut

                                                    chapeaux, vraiment, ca évolue très vite :p

                                                    petite question : a partir de quelle progression dans la programmation je peux présenter un rpg ? car j'aimerais bien présenter mon projet dans le forum C afin d'avoir des avis sur le code de mon jeux, les technique utiliser, etc, etc. mais je ne sais pas a partir de quand je peux poster.

                                                    sinon, ton jeux, comment gère tu les dialogue ? ou a tu trouver la zone de texte ?

                                                    Merci !
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      17 décembre 2009 à 13:43:24

                                                      Salut,

                                                      Je pense que tu peux présenter ton RPG n'importe quand, du moment que tu as déjà des choses précises à montrer. C'est sûr que si tu peux faire une petite démo, c'est mieux que quelques screenshots, mais tu peux commencer par là. A mon avis, faut pas avoir peur de commencer petit et d'avancer doucement mais un peu à chaque fois. Tu risques d'avoir des critiques mais c'est pas grave tant qu'elles sont constructives. Grâce à ce forum, j'ai déjà corriger pas mal de trucs auxquels j'aurais pas pensé tout seul, et ça c'est super ! :D

                                                      Sinon, pour les dialogues, je procède comme suit :
                                                      - j'ai 2 villageois paramétrables dans le leveleditor grâce à plusieurs variables (globales mais c'est pas obligé) : les coordonnées, le fait s'ils sont vivants ou morts (on les affiche ou non), une variable Action : si elle vaut 0 le villageois parle, sinon c'est un vendeur, et une autre variable pour le texte qui contient un nombre de 0 à 999.
                                                      - Quand il y a collision avec un villageois, on teste s'il parle ou s'il vend.
                                                      - S'il parle, on prend le numéro de la variable (par exemple : 46) et on l'ajoute dans une chaîne de char à ".dialog" (ex.: 46.dialog).
                                                      - On ouvre alors le fichier dialogues/46.dialog et on le lit.
                                                      - On transforme chaque ligne (en enlevant le retour chariot) en SDL_surface grâce à SDL_TTF.
                                                      - On affiche l'image de fond de la boîte de dialogue (que j'ai dessinée moi-même), puis par dessus chaque ligne l'une en-dessous de l'autre.
                                                      - On attend un appui sur le clavier pour retourner au jeu normal (qui réactualise donc l'image et efface les dialogues).
                                                      Bien sûr, mon système a ses limites et mériterait d'être amélioré en permettant plus d'un écran de texte (pour l'instant mon code le permet mais bugge avec la gestion d'un appui sur une touche (sans doute à cause de SDL_Enablekeyrepeat) pour plusieurs écrans - j'ai pas eu le temps (le courage :p ) de m'en occuper). On pourrait aussi choisir d'afficher la boîte en haut ou en bas suivant la position du player.

                                                      Voilà le code, qui n'est pas parfait, et si qqn voit comment l'améliorer, surtout pour la gestion du clavier, je suis preneur ! :D

                                                      int AfficheDialogues (SDL_Surface *ecran, TTF_Font *police, int dialogue)
                                                      {
                                                      
                                                          //Fichier
                                                          char nomFichier[25] = "";
                                                          sprintf (nomFichier, "dialogues/%d.dialog", dialogue);
                                                          int caractereLu = 0, nombreLignes = 0, i = 0, j = 0, continuer = 1;
                                                          FILE* fichier = NULL;
                                                          int tempoTouche = SDL_GetTicks();
                                                          fichier = fopen ( nomFichier, "r");
                                                          if (fichier == NULL)
                                                              return 0;
                                                      
                                                          //On compte le nombre de lignes
                                                          do
                                                          {
                                                          caractereLu = fgetc(fichier);
                                                          if (caractereLu == '\n')
                                                              nombreLignes++;
                                                          } while(caractereLu != EOF);
                                                      
                                                          i = nombreLignes / 4;  // on affiche trois lignes à la fois. le fichier doit donc etre composé de séquences de trois lignes
                                                      
                                                          //Rembobinage fichier
                                                          rewind ( fichier );
                                                      
                                                          //Variables
                                                          SDL_Color couleurBlanche = {255, 255, 255};
                                                          SDL_Rect posD;
                                                             posD.x = 1;
                                                             posD.y = 0;
                                                      
                                                          SDL_Rect posT1;
                                                             posT1.x = 20;
                                                             posT1.y = 15;
                                                          SDL_Rect posT2;
                                                             posT2.x = 20;
                                                             posT2.y = 40;
                                                          SDL_Rect posT3;
                                                             posT3.x = 20;
                                                             posT3.y = 65;
                                                          SDL_Rect posT4;
                                                             posT4.x = 20;
                                                             posT4.y = 90;
                                                      
                                                         char chaine1 [70];
                                                         char chaine2 [70];
                                                         char chaine3 [70];
                                                         char chaine4 [70];
                                                      
                                                          for ( j = 0; j <= i; j++)
                                                          {
                                                      
                                                      
                                                      
                                                         //On lit les trois lignes du fichier
                                                         fgets(chaine1, 55, fichier);
                                                         chaine1[strlen(chaine1) - 1] = '\0';
                                                         fgets(chaine2, 55, fichier);
                                                         cine2[strlen(chaine2) - 1] = '\0';
                                                         fgets(chaine3, 55, fichier);
                                                         chaine3[strlen(chaine3) - 1] = '\0';
                                                         fgets(chaine4, 55, fichier);
                                                         chaine4[strlen(chaine4) - 1] = '\0';
                                                      
                                                         SDL_Surface *texte1 = NULL, *texte2 = NULL, *texte3 = NULL, *texte4 = NULL,*fond = NULL;
                                                         fond = IMG_Load("fond/dialog.bmp");
                                                         SDL_BlitSurface(fond, NULL, ecran, &posD);
                                                      
                                                          texte1 = TTF_RenderText_Blended(police, chaine1, couleurBlanche);
                                                          SDL_BlitSurface(texte1, NULL, ecran, &posT1);
                                                          texte2 = TTF_RenderText_Blended(police, chaine2, couleurBlanche);
                                                          SDL_BlitSurface(texte2, NULL, ecran, &posT2);
                                                          texte3 = TTF_RenderText_Blended(police, chaine3, couleurBlanche);
                                                          SDL_BlitSurface(texte3, NULL, ecran, &posT3);
                                                          texte4 = TTF_RenderText_Blended(police, chaine4, couleurBlanche);
                                                          SDL_BlitSurface(texte4, NULL, ecran, &posT4);
                                                      
                                                          //On affiche
                                                          SDL_Flip(ecran);
                                                      
                                                         
                                                          SDL_EnableKeyRepeat(0, 0);
                                                      
                                                          while (continuer)
                                                      {
                                                          SDL_Event event;
                                                      
                                                          SDL_PollEvent(&event);
                                                              switch(event.type)
                                                              {
                                                                  case SDL_KEYDOWN:
                                                                      if (tempoTouche + 1000 < SDL_GetTicks()) {
                                                                          continuer = 0;
                                                                          tempoTouche = SDL_GetTicks();
                                                                          event.type=0; }
                                                                      else event.type=0;
                                                                      break;
                                                              }
                                                      
                                                      
                                                      
                                                      
                                                          }
                                                      
                                                      
                                                          //On libere la memoire sinon elle gonfle
                                                              SDL_FreeSurface(texte1);
                                                              SDL_FreeSurface(texte2);
                                                              SDL_FreeSurface(texte3);
                                                              SDL_FreeSurface(texte4);
                                                              SDL_FreeSurface(fond);
                                                      
                                                      
                                                          }
                                                      
                                                          fclose(fichier);
                                                          SDL_EnableKeyRepeat(10, 10);
                                                          return 0 ;
                                                      }
                                                      
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        17 décembre 2009 à 13:53:31

                                                        Merci !

                                                        je pense que je vais présenter mon projet aujourd'hui, dans le forum dédier a cela. il faut juste que je trouve un titre, et que je débugue une fonction ( il me met une erreur de syntaxe car il ne connais pas une structure, alors que j'ai inclue le fichier qui contient le typedef )
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          17 décembre 2009 à 19:03:10

                                                          Moi, je crois savoir comment améliorer ta gestion de texte, attends je te trouve ça...

                                                          EDIT: Voilà !
                                                          Une mini librairie codée par CokieForever qui sert surtout à récupérer le texte que le joueur tape, mais aussi à l'afficher.

                                                          L'avantage c'est qu'elle fournit un code propre, clair et fonctionnel, et qu'en plus (pour avoir discuté avec lui) Cokie est relativement sympa, alors si t'as un problème avec sa lib' il sera là pour t'aider.
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            17 décembre 2009 à 19:19:55

                                                            Merci roibakura, je vais regarder ça et je m'en servirai sans doute dans mon prochain projet. ;)
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            Action RPG en 2D en C avec SDL et FMOD

                                                            × 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