Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme d'affichage de formes avec SDL en C

Sujet résolu
    30 novembre 2020 à 19:09:42

    Bonjour à tous!

    Dans le cadre d'un projet en C, je suis en train de créer un mastermind avec la bibliothèque sdl. Je crée 4 disque de couleurs différentes pour pouvoir cliquer dessus et afficher un disque de la couleur correspondante sur le plateau de jeu. Cependant lorsque je clique sur un disque, dès que je bouge ma souris le disque créé disparais, je suppose que ça a un lien avec le pollevent mais je ne vois pas comment régler ce problème. 

    Je vous met juste en dessous les portions de codes qui pour moi sont à problème

    while (continuer)
        {
            SDL_PollEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
                case SDL_MOUSEBUTTONUP:
                    if (event.button.button == SDL_BUTTON_LEFT)
                    {
                        int x = event.button.x;
                        int y = event.button.y;
                        if (x>0 & x<2000 & y>0 & y<2000)
                        {
                           clique_couleurs(ecran,x,y);
                        }
                    }
                break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE: // Veut arrêter le jeu
                            continuer = 0;
                            break;
                        case SDLK_KP1: // Demande à jouer
                            jouer(ecran);
                            break;
                    }
                    break;
            }
    
    
    
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 70,70,70));
    
            position1.x = 1150; // Les coordonnées de la surface seront (0, 0)
            position1.y = 250;
        // Remplissage de la surface avec du blanc
            SDL_FillRect(rectangle1, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
            SDL_BlitSurface(rectangle1, NULL, ecran, &position1);
        /* Blit du texte */
            position.x = 0;
            position.y = 0;
            SDL_BlitSurface(texte_titre, NULL, ecran, &position);
            afficherformes(ecran);
            SDL_Flip(ecran);
        }

    Et voici la méthode clique_couleur

    void clique_couleurs(SDL_Surface* ecran,int x,int y)
    {
        SDL_Surface *pion_rouge=NULL;
        SDL_Rect p;
        if (x>1150 & x<1250 & y>100 & y<200){
            p.x=100+550;
            p.y=100;
    
            pion_rouge=IMG_Load("pion_rouge_petit.png");
            SDL_BlitSurface(pion_rouge, NULL, ecran, &p);
            SDL_Flip(ecran);
    
            }
    
    }

    Merci beaucoup de votre attention:

    PS: J'ai aussi un problème, le disque que je crée clignote comme si il y avait un problème à la superposition.

    -
    Edité par GuillaumeTardy2 30 novembre 2020 à 19:15:27

    • Partager sur Facebook
    • Partager sur Twitter
      30 novembre 2020 à 20:40:31

      Hello,

      Dans ce jeu, rien ne doit se passer si le joueur n'intervient pas (pas de nuage ou d'ennemi à déplacer p.ex.). Je te conseille donc d'utiliser SDL_WaitEvent(). Mais je ne sais pas si ça résoudra ton problème, il y a tellement peu de code.

      Accessoirement (mais très conseillé), voilà 7 ou 8 ans que sdl 1.x a été remplacé par par sdl 2.x .... il serait bon de migrer tout de suite.

      Edit: en C, on parle de fonction, pas de méthode.

      -
      Edité par edgarjacobs 30 novembre 2020 à 20:44:22

      • 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

        30 novembre 2020 à 22:29:49

        merci de ton aide! malheuresement lorsque je remplace par wait_event il ne se passe rien même quand je clique au bon endroit. 

        Pour ce qui est de SDL1 je suis totalement de ton idée cependant mon enseignant s'est obstiné à nous faire des cours sur sdl1 et je ne pense pas pouvoir migrer vers sdl2.

        Merci pour le vocabulaire, je confonds souvent entre chaque langage!

        Voici le code complet du main et apres les codes pour créer le disque que j'appelle

        #include <stdlib.h>
        #include <stdio.h>
        #include <SDL.h>
        #include <SDL_image.h>
        #include <SDL/SDL_ttf.h>
        #include "jouer.h"
        
        int main(int argc, char *argv[])
        {
            SDL_Surface *ecran = NULL, *texte_titre = NULL, *texte_choix1 = NULL, *texte_choix2 = NULL, *texte_choix3 = NULL, *fond = NULL,*lignes[256] = {NULL},*rectangle = NULL;
            SDL_Rect position,position1;
            SDL_Event event;
            TTF_Font *police = NULL;
            SDL_Color couleurNoire = {0, 0, 0};
            SDL_Color couleurBlanc = {255, 255, 255};
            SDL_Color couleurRouge = {255, 0, 0};
            int continuer = 1;
            int i = 0;
        
            SDL_Init(SDL_INIT_VIDEO);
            TTF_Init();
            const SDL_VideoInfo* myPointer = SDL_GetVideoInfo();
        
            ecran = SDL_SetVideoMode(myPointer->current_w, myPointer->current_h, myPointer->vfmt->BitsPerPixel, SDL_DOUBLEBUF|SDL_HWSURFACE);
            SDL_WM_SetCaption("Premier test Mastermind", NULL);
        
            for (i = 0 ; i <= 255 ; i++)
                lignes[i] = SDL_CreateRGBSurface(SDL_HWSURFACE,myPointer->current_w , 3, 32, 0, 0, 0, 0);
        
            /*fond = IMG_Load("lac_en_montagne.bmp");*/
        
            /* Chargement de la police */
            police = TTF_OpenFont("Glitch.otf", 65);
            /* Écriture du texte dans la SDL_Surface texte en mode Blended (optimal) */
            texte_titre = TTF_RenderText_Blended(police, "Mastermind", couleurBlanc);
            texte_choix1 = TTF_RenderText_Blended(police, "Jouer", couleurBlanc);
            texte_choix2 = TTF_RenderText_Blended(police, "Regles du jeu", couleurBlanc);
            texte_choix3 = TTF_RenderText_Blended(police, "Quitter", couleurBlanc);
        
            while (continuer)
            {
                SDL_WaitEvent(&event);
                switch(event.type)
                {
                    case SDL_QUIT:
                        continuer = 0;
                        break;
                    case SDL_MOUSEBUTTONUP:
                        if (event.button.button == SDL_BUTTON_LEFT) /* On arrête le programme si on a fait un clic gauche */
                        {
                            int x = event.button.x;
                            int y = event.button.y;
                            if (x>450 & x<750 & y>250 & y<330)
                            {
                               jouer(ecran);
                            }
                        }
                    break;
        
                    case SDL_KEYDOWN:
                        switch(event.key.keysym.sym)
                        {
                            case SDLK_ESCAPE: // Veut arrêter le jeu
                                continuer = 0;
                                break;
                            case SDLK_KP1: // Demande à jouer
                                jouer(ecran);
                                break;
                        }
                        break;
                }
        
                SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
        
               for (i = 0 ; i <= 255 ; i++)
            {
                position.x = 0; // Les lignes sont à gauche (abscisse de 0)
                position.y = 3*i; // La position verticale dépend du numéro de la ligne
                SDL_FillRect(lignes[i], NULL, SDL_MapRGB(ecran->format, 128, i, 128));
                SDL_BlitSurface(lignes[i], NULL, ecran, &position);
            }
            /* Blit du texte */
        
                SDL_BlitSurface(rectangle, NULL, ecran, &position1);
                position.x = (myPointer->current_w)/3;
                position.y = 0;
                SDL_BlitSurface(texte_titre, NULL, ecran, &position);
                position.x = (myPointer->current_w)/3;
                position.y = (myPointer->current_h)/3;
                SDL_BlitSurface(texte_choix1, NULL, ecran, &position);
                position.x = (myPointer->current_w)/3;
                position.y = ((myPointer->current_h)/3)+100;
                SDL_BlitSurface(texte_choix2, NULL, ecran, &position);
                position.x = (myPointer->current_w)/3;
                position.y = ((myPointer->current_h)/3)+200;
                SDL_BlitSurface(texte_choix3, NULL, ecran, &position);
        
                SDL_Flip(ecran);
            }
        
            TTF_CloseFont(police);
            TTF_Quit();
        
            SDL_FreeSurface(texte_titre);
            SDL_FreeSurface(texte_choix1);
            SDL_FreeSurface(texte_choix2);
            SDL_FreeSurface(texte_choix3);
            SDL_Quit();
        
            return EXIT_SUCCESS;
        }
        
        void ligneHorizontale(int x, int y, int w, Uint32 coul,SDL_Surface* ecran)
        {
          SDL_Rect r;
        
          r.x = x;
          r.y = y;
          r.w = w;
          r.h = 1;
        
          SDL_FillRect(ecran, &r, coul);
        }
        
        void disque(int cx, int cy, int rayon, int coul,SDL_Surface* ecran)
        {
          int d, y, x;
        
          d = 3 - (2 * rayon);
          x = 0;
          y = rayon;
        
          while (y >= x) {
            ligneHorizontale(cx - x, cy - y, 2 * x + 1, coul,ecran);
            ligneHorizontale(cx - x, cy + y, 2 * x + 1, coul,ecran);
            ligneHorizontale(cx - y, cy - x, 2 * y + 1, coul,ecran);
            ligneHorizontale(cx - y, cy + x, 2 * y + 1, coul,ecran);
        
            if (d < 0)
              d = d + (4 * x) + 6;
            else {
              d = d + 4 * (x - y) + 10;
              y--;
            }
        
            x++;
          }
        }




        -
        Edité par GuillaumeTardy2 1 décembre 2020 à 8:14:57

        • Partager sur Facebook
        • Partager sur Twitter
          1 décembre 2020 à 9:15:07

          Tu diras à ton enseignant de se mettre à jour ou d'arrêter d'enseigner. La SDL 1.2 est obsolète et n'est plus supportée depuis plus de 8 ans. Cela ne sert à rien d'enseigner des techniques obsolètes.
          • Partager sur Facebook
          • Partager sur Twitter

          git is great because Linus did it, mercurial is better because he didn't.

            1 décembre 2020 à 11:19:41

            Bonjour,

            Dans le premier code, la ligne 3 n’est pas correcte.

            SDL1 ou SDL2, la bonne façon de dépiler les évènements est un bloc « while » qui teste le retour de la fonction :

            while (SDL_PollEvent(&event))
            {
                 switch(event.type)  // Traitement des évènements
                 {
                      // ..
            
                 }
            
            }
            



            • Partager sur Facebook
            • Partager sur Twitter
            Architecture SDL                     Multithreading         
              1 décembre 2020 à 12:08:53

              Merci beaucoup pour l'aide, malheureusement ca ne fonctionne pas, mon disque de couleur reste affiché pendant un court lapse de temps.

              Je pense que je vais passer sur SDL2 revoir les tutos pour refaire quelque chose de propre et le dire a l'enseignant.

              • Partager sur Facebook
              • Partager sur Twitter
                2 décembre 2020 à 17:34:58

                Bon si quelqu'un retombe sur ce sujet, je viens de me rendre compte de mon erreur de débutant, en effet j'affiche les formes et le fond apres le switch/case qui affiche mon disque, evidemment des que je sors du cas ou j'ai afficher mon disque, l'idiot que je suis efface tout. En gros sur le premier code que j'ai envoyé de la ligne 35 à la ligne 46 il faut le mettre avant le while(continuer). Voila voila...
                • Partager sur Facebook
                • Partager sur Twitter

                Probleme d'affichage de formes avec SDL en C

                × 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