Partage
  • Partager sur Facebook
  • Partager sur Twitter

SDL

Déplacement des objets avec les clics de la souris

    27 mars 2017 à 11:16:41

    Bonjour,

    je suis entrain de faire un petit jeu de dame sur SDL.

    Pour les pions , j'ai pris des images sur internet que je j'ai convertis en bmp avec paint.

    Maintenant je veux déplacer mes pions en cliquant sur la souris (maintenir le bouton gauche puis la relâcher à la position voulue).

    dans mon code, j'essaie de déplacer le pionB8.

    Merci pour votre aide.

    Code:


    int main ( int argc, char** argv )
    {
        SDL_Surface *fenetre=NULL, *rectangle=NULL;
        int continuer;
        int souris;
        SDL_Event event;

        // CREATION ET MANIPULAION DES PIONS NOIRS ET BLANCS--------------------------------------------------------------

        SDL_Surface *PionN=NULL,*PionN2=NULL,*PionN3=NULL,*PionN4=NULL,*PionN5=NULL,*PionN6=NULL,*PionN7=NULL,*PionN8=NULL;
        SDL_Surface *PionB=NULL,*PionB2=NULL,*PionB3=NULL,*PionB4=NULL,*PionB5=NULL,*PionB6=NULL,*PionB7=NULL,*PionB8=NULL;
        SDL_Rect positionPionN,positionPionN2,positionPionN3,positionPionN4,positionPionN5,positionPionN6,positionPionN7, positionPionN8;
        SDL_Rect positionPionB,positionPionB2,positionPionB3,positionPionB4,positionPionB5,positionPionB6,positionPionB7, positionPionB8;

        SDL_Rect position;

        int i, j;

        SDL_Init(SDL_INIT_VIDEO);

        fenetre=SDL_SetVideoMode(399,399,32,SDL_HWSURFACE);
        SDL_FillRect(fenetre,NULL,SDL_MapRGB(fenetre->format,100,100,100));// CHANGEMENT DE LES COULEUR NOIR DES CASES EN GRIS

        rectangle=SDL_CreateRGBSurface(SDL_HWSURFACE,50,50,32,0,0,0,0);
        SDL_WM_SetCaption("DAMIER",NULL);

        SDL_FillRect(rectangle, NULL, SDL_MapRGB(fenetre->format,255,255,255));

        for(i=0;i<=8;i++)
        {
           for(j=0;j<=8;j++)
           {
               if((i+j)%2)
               {
                   position.x=(i-1)*50;
                   position.y=(j-1)*50;
                   SDL_BlitSurface(rectangle,NULL,fenetre,&position);
               }
           }
        }


       // POSITION DES PIONS NOIRS DU DAMIERL--------------------------------------------------------------------------

       // PionN1

        positionPionN.x=0;
        positionPionN.y=0;
        PionN=SDL_LoadBMP("pion_Noir.bmp");
        //SDL_SetColorKey(PionN1,SDL_SRCCOLORKEY,SDL_MapRGB(PionN1->format,0,0,0));
        SDL_BlitSurface(PionN,NULL,fenetre,&positionPionN);

         // PionN2

        positionPionN2.x=100;
        positionPionN2.y=0;
        PionN2=SDL_LoadBMP("pion_Noir.bmp");
        SDL_BlitSurface(PionN2,NULL,fenetre,&positionPionN2);

         // PionN3

        positionPionN3.x=200;
        positionPionN3.y=0;
        PionN3=SDL_LoadBMP("pion_Noir.bmp");
        SDL_BlitSurface(PionN3,NULL,fenetre,&positionPionN3);

         // PionN4

        positionPionN4.x=300;
        positionPionN4.y=0;
        PionN4=SDL_LoadBMP("pion_Noir.bmp");
        SDL_BlitSurface(PionN4,NULL,fenetre,&positionPionN4);

         // PionN5

        positionPionN5.x=50;
        positionPionN5.y=50;
        PionN5=SDL_LoadBMP("pion_Noir.bmp");
        SDL_BlitSurface(PionN5,NULL,fenetre,&positionPionN5);

         // PionN6

        positionPionN6.x=150;
        positionPionN6.y=50;
        PionN6=SDL_LoadBMP("pion_Noir.bmp");
        SDL_BlitSurface(PionN6,NULL,fenetre,&positionPionN6);

         // PionN7

        positionPionN7.x=250;
        positionPionN7.y=50;
        PionN7=SDL_LoadBMP("pion_Noir.bmp");
        SDL_BlitSurface(PionN7,NULL,fenetre,&positionPionN7);

         // PionN8

        positionPionN8.x=350;
        positionPionN8.y=50;
        PionN8=SDL_LoadBMP("pion_Noir.bmp");
        SDL_BlitSurface(PionN8,NULL,fenetre,&positionPionN8);
        // FIN DU REMPLISSAGE DES PIONS NOIRS---------------------------------------------------------------------

       // POSITION DES PIONS NOIRS DU DAMIER--------------------------------------------------------------------------

       // PionB1

        positionPionB.x=0;
        positionPionB.y=350;
        PionB=SDL_LoadBMP("pion_Blanc.bmp");
        SDL_BlitSurface(PionB,NULL,fenetre,&positionPionB);

        // PionB2

        positionPionB2.x=100;
        positionPionB2.y=350;
        PionB2=SDL_LoadBMP("pion_Blanc.bmp");
        SDL_BlitSurface(PionB2,NULL,fenetre,&positionPionB2);

        // PionB3

        positionPionB3.x=200;
        positionPionB3.y=350;
        PionB3=SDL_LoadBMP("pion_Blanc.bmp");
        SDL_BlitSurface(PionB3,NULL,fenetre,&positionPionB3);

        // PionB4

        positionPionB4.x=300;
        positionPionB4.y=350;
        PionB4=SDL_LoadBMP("pion_Blanc.bmp");
        SDL_BlitSurface(PionB4,NULL,fenetre,&positionPionB4);

        // PionB5

        positionPionB5.x=50;
        positionPionB5.y=300;
        PionB5=SDL_LoadBMP("pion_Blanc.bmp");
        SDL_BlitSurface(PionB5,NULL,fenetre,&positionPionB5);

        // PionB6

        positionPionB6.x=150;
        positionPionB6.y=300;
        PionB6=SDL_LoadBMP("pion_Blanc.bmp");
        SDL_BlitSurface(PionB6,NULL,fenetre,&positionPionB6);

        // PionB7

        positionPionB7.x=250;
        positionPionB7.y=300;
        PionB7=SDL_LoadBMP("pion_Blanc.bmp");
        SDL_BlitSurface(PionB7,NULL,fenetre,&positionPionB7);

        // PionB8

        positionPionB8.x=350;
        positionPionB8.y=300;
        PionB8=SDL_LoadBMP("pion_Blanc.bmp");
        SDL_BlitSurface(PionB8,NULL,fenetre,&positionPionB8);

        // FIN DU REMPLISSAGE DES PIONS NOIRS---------------------------------------------------------------------

        SDL_WM_SetCaption("DAMIER SDL",NULL);

        SDL_Flip(fenetre);

     
        SDL_EnableKeyRepeat(50,50);
         while(continuer)
         {
           SDL_Event fermer;
           SDL_WaitEvent(&fermer);

           switch(event.type)
           {
            case SDL_QUIT:
                continuer=0;
                break;
            case SDL_KEYDOWN:
                switch(fermer.key.keysym.sym)
                {
                case SDLK_ESCAPE:
                    continuer=0;
                    break;
                case SDLK_UP:
                    positionPionB8.y=positionPionB8.y-1;
                    break;
                case SDLK_DOWN:
                    positionPionB8.y=positionPionB8.y+1;
                    break;
                case SDLK_LEFT:
                    positionPionB8.x=positionPionB8.x-1;
                    break;
                case SDLK_RIGHT:
                    positionPionB8.x=positionPionB8.x+1;
                    break;
                default:
                    break;
                }
                break;
                case SDL_MOUSEBUTTONDOWN:
                    souris=1;
                    break;
                case SDL_MOUSEBUTTONUP:
                    souris= 0;
                    break;
                    default: break;
           }
           if(souris)
           {
               positionPionB8.x=event.motion.x;
               positionPionB8.y=event.motion.y;
           }
           SDL_BlitSurface(PionB8,NULL,fenetre,&positionPionB8);
           SDL_Flip(fenetre);
         }

       // CREATION D'UNE BOUCLE PSEUDO INFINIE POUR FERMER LA FENETRE CREE----------------------------------------------

       SDL_FreeSurface(fenetre);

       SDL_FreeSurface(rectangle);

       SDL_Quit();
       return 0;
    }

    • Partager sur Facebook
    • Partager sur Twitter
      27 mars 2017 à 13:35:24

      Salut,

      il faut lire les règles du forum et mettre ton code entre balises </> pour qu'il soit lisible.

      Personne ne se donnera la peine de lire ton code dans ces conditions.

      Au delà de ça, ton code est très mal conçu. Il faut automatiser au maximum, tu ne fais que du cas par cas. Il faut utiliser des tables et des boucles. Pourquoi charger 8 fois la même image ? il suffit de ré-afficher la même à différents endroits...

      • Partager sur Facebook
      • Partager sur Twitter

      Bonhomme !! | Jeu de plateforme : Prototype.

        27 mars 2017 à 16:52:32

        j'ai chargé 8 fois parce que à la base c'était un jeu d'échec que je voulais faire et je ne voyais pas comment automatiser autant de pions différents les uns des autres.

        int main ( int argc, char** argv )
        {
            SDL_Surface *fenetre=NULL, *rectangle=NULL;
            int continuer;
            int souris;
            SDL_Event event;
            // CREATION ET MANIPULAION DES PIONS NOIRS ET BLANCS--------------------------------------------------------------
            SDL_Surface *PionN=NULL,*PionN2=NULL,*PionN3=NULL,*PionN4=NULL,*PionN5=NULL,*PionN6=NULL,*PionN7=NULL,*PionN8=NULL;
            SDL_Surface *PionB=NULL,*PionB2=NULL,*PionB3=NULL,*PionB4=NULL,*PionB5=NULL,*PionB6=NULL,*PionB7=NULL,*PionB8=NULL;
            SDL_Rect positionPionN,positionPionN2,positionPionN3,positionPionN4,positionPionN5,positionPionN6,positionPionN7, positionPionN8;
            SDL_Rect positionPionB,positionPionB2,positionPionB3,positionPionB4,positionPionB5,positionPionB6,positionPionB7, positionPionB8;
            SDL_Rect position;
            int i, j;
            SDL_Init(SDL_INIT_VIDEO);
            fenetre=SDL_SetVideoMode(399,399,32,SDL_HWSURFACE);
            SDL_FillRect(fenetre,NULL,SDL_MapRGB(fenetre->format,100,100,100));// CHANGEMENT DE LES COULEUR NOIR DES CASES EN GRIS
            rectangle=SDL_CreateRGBSurface(SDL_HWSURFACE,50,50,32,0,0,0,0);
            SDL_WM_SetCaption("DAMIER",NULL);
            SDL_FillRect(rectangle, NULL, SDL_MapRGB(fenetre->format,255,255,255));
            for(i=0;i<=8;i++)
            {
               for(j=0;j<=8;j++)
               {
                   if((i+j)%2)
                   {
                       position.x=(i-1)*50;
                       position.y=(j-1)*50;
                       SDL_BlitSurface(rectangle,NULL,fenetre,&position);
                   }
               }
            }
        
           // POSITION DES PIONS NOIRS DU DAMIERL--------------------------------------------------------------------------
           // PionN1
            positionPionN.x=0;
            positionPionN.y=0;
            PionN=SDL_LoadBMP("pion_Noir.bmp");
            //SDL_SetColorKey(PionN1,SDL_SRCCOLORKEY,SDL_MapRGB(PionN1->format,0,0,0));
            SDL_BlitSurface(PionN,NULL,fenetre,&positionPionN);
             // PionN2
            positionPionN2.x=100;
            positionPionN2.y=0;
            PionN2=SDL_LoadBMP("pion_Noir.bmp");
            SDL_BlitSurface(PionN2,NULL,fenetre,&positionPionN2);
             // PionN3
            positionPionN3.x=200;
            positionPionN3.y=0;
            PionN3=SDL_LoadBMP("pion_Noir.bmp");
            SDL_BlitSurface(PionN3,NULL,fenetre,&positionPionN3);
             // PionN4
            positionPionN4.x=300;
            positionPionN4.y=0;
            PionN4=SDL_LoadBMP("pion_Noir.bmp");
            SDL_BlitSurface(PionN4,NULL,fenetre,&positionPionN4);
             // PionN5
            positionPionN5.x=50;
            positionPionN5.y=50;
            PionN5=SDL_LoadBMP("pion_Noir.bmp");
            SDL_BlitSurface(PionN5,NULL,fenetre,&positionPionN5);
             // PionN6
            positionPionN6.x=150;
            positionPionN6.y=50;
            PionN6=SDL_LoadBMP("pion_Noir.bmp");
            SDL_BlitSurface(PionN6,NULL,fenetre,&positionPionN6);
             // PionN7
            positionPionN7.x=250;
            positionPionN7.y=50;
            PionN7=SDL_LoadBMP("pion_Noir.bmp");
            SDL_BlitSurface(PionN7,NULL,fenetre,&positionPionN7);
             // PionN8
            positionPionN8.x=350;
            positionPionN8.y=50;
            PionN8=SDL_LoadBMP("pion_Noir.bmp");
            SDL_BlitSurface(PionN8,NULL,fenetre,&positionPionN8);
            // FIN DU REMPLISSAGE DES PIONS NOIRS---------------------------------------------------------------------
           // POSITION DES PIONS NOIRS DU DAMIER--------------------------------------------------------------------------
           // PionB1
            positionPionB.x=0;
            positionPionB.y=350;
            PionB=SDL_LoadBMP("pion_Blanc.bmp");
            SDL_BlitSurface(PionB,NULL,fenetre,&positionPionB);
            // PionB2
            positionPionB2.x=100;
            positionPionB2.y=350;
            PionB2=SDL_LoadBMP("pion_Blanc.bmp");
            SDL_BlitSurface(PionB2,NULL,fenetre,&positionPionB2);
            // PionB3
            positionPionB3.x=200;
            positionPionB3.y=350;
            PionB3=SDL_LoadBMP("pion_Blanc.bmp");
            SDL_BlitSurface(PionB3,NULL,fenetre,&positionPionB3);
            // PionB4
            positionPionB4.x=300;
            positionPionB4.y=350;
            PionB4=SDL_LoadBMP("pion_Blanc.bmp");
            SDL_BlitSurface(PionB4,NULL,fenetre,&positionPionB4);
            // PionB5
            positionPionB5.x=50;
            positionPionB5.y=300;
            PionB5=SDL_LoadBMP("pion_Blanc.bmp");
            SDL_BlitSurface(PionB5,NULL,fenetre,&positionPionB5);
            // PionB6
            positionPionB6.x=150;
            positionPionB6.y=300;
            PionB6=SDL_LoadBMP("pion_Blanc.bmp");
            SDL_BlitSurface(PionB6,NULL,fenetre,&positionPionB6);
            // PionB7
            positionPionB7.x=250;
            positionPionB7.y=300;
            PionB7=SDL_LoadBMP("pion_Blanc.bmp");
            SDL_BlitSurface(PionB7,NULL,fenetre,&positionPionB7);
            // PionB8
            positionPionB8.x=350;
            positionPionB8.y=300;
            PionB8=SDL_LoadBMP("pion_Blanc.bmp");
            SDL_BlitSurface(PionB8,NULL,fenetre,&positionPionB8);
            // FIN DU REMPLISSAGE DES PIONS NOIRS---------------------------------------------------------------------
            SDL_WM_SetCaption("DAMIER SDL",NULL);
            SDL_Flip(fenetre);
         
            SDL_EnableKeyRepeat(50,50);
             while(continuer)
             {
               SDL_Event fermer;
               SDL_WaitEvent(&fermer);
               switch(event.type)
               {
                case SDL_QUIT:
                    continuer=0;
                    break;
                case SDL_KEYDOWN:
                    switch(fermer.key.keysym.sym)
                    {
                    case SDLK_ESCAPE:
                        continuer=0;
                        break;
                    case SDLK_UP:
                        positionPionB8.y=positionPionB8.y-1;
                        break;
                    case SDLK_DOWN:
                        positionPionB8.y=positionPionB8.y+1;
                        break;
                    case SDLK_LEFT:
                        positionPionB8.x=positionPionB8.x-1;
                        break;
                    case SDLK_RIGHT:
                        positionPionB8.x=positionPionB8.x+1;
                        break;
                    default:
                        break;
                    }
                    break;
                    case SDL_MOUSEBUTTONDOWN:
                        souris=1;
                        break;
                    case SDL_MOUSEBUTTONUP:
                        souris= 0;
                        break;
                        default: break;
               }
               if(souris)
               {
                   positionPionB8.x=event.motion.x;
                   positionPionB8.y=event.motion.y;
               }
               SDL_BlitSurface(PionB8,NULL,fenetre,&positionPionB8);
               SDL_Flip(fenetre);
             }
           // CREATION D'UNE BOUCLE PSEUDO INFINIE POUR FERMER LA FENETRE CREE----------------------------------------------
           SDL_FreeSurface(fenetre);
           SDL_FreeSurface(rectangle);
           SDL_Quit();
           return 0;
        }
        



        -
        Edité par Black_Mamba_1 27 mars 2017 à 17:15:58

        • Partager sur Facebook
        • Partager sur Twitter
          28 mars 2017 à 11:48:31

          Salut

          Juste , pour te simplifier la vie , crée toi un tableau de 10case X 10 ! 

          Pour déplacer le pion , t'aura juste un test à faire

          Si BPSourisCliquer == caseAMoi
          
            alors attendreBPSourisRelacher
          
          si SourisRelacher == caseX+1 || SourisRelacher = caseX-1 && case!= caseAMoi
          
            alors déplacerLePion 

          je te conseil de t'inspirer du code source du TP de mathéo (mario Sokoban), pour comprendre ce principe de case :)

          edit : je crois que ta bien fais 1 tableau dans un autre fichier , mais tu doit mal l'exploiter :/

          Pour savoir 

          -
          Edité par raptord 28 mars 2017 à 11:51:39

          • Partager sur Facebook
          • Partager sur Twitter
          Zozor . . . Où est tu passé ??? :(
            7 avril 2017 à 11:00:50

            Bonjour,

            je suis toujours entrain de continuer mon jeux et je sui bloqué. Je veux déplacer un pion avec la souris mais je n'y arrive pas. Ce que je veux c'est quand je clique sur mon pion et que je clique quelque part dans ma fenêtre, mon pion se déplace vers la position du second clique. Je vous joins mon code, et merci de me dire si il y'a des erreurs de syntaxe ou autres.

             while(1)
                {
                    SDL_Event event ;
                    SDL_WaitEvent(&event);
                    if(event.type==SDL_QUIT)
                    break;
                    //-----------------------------------------------------
                    SDL_PollEvent(&event);
            
                    switch(event.type)
                    case SDL_MOUSEBUTTONDOWN:
                    if(event.button.button==SDL_BUTTON_LEFT)
                    {
                        PionB16=SDL_LoadBMP("pion_blanc.bmp");
                        positionPionB16.x=event.button.x;
                        positionPionB16.y=event.button.y;
                        SDL_BlitSurface(PionB16,NULL,fenetre,&positionPionB16);
                        break;
                    }
                    SDL_BlitSurface(PionB16,NULL,fenetre,&positionPionB16);
            
                    switch(event.type)
                    case SDL_MOUSEBUTTONUP:
                    if(event.button.button==SDL_BUTTON_LEFT)
                    {
                        PionB16=SDL_LoadBMP("pion_blanc.bmp");
                        positionPionB16.x=event.button.x;
                        positionPionB16.y=event.button.y;
                        SDL_BlitSurface(PionB16,NULL,fenetre,&positionPionB16);
                        break;
                    }
            
                    switch(event.type)
                    case SDL_MOUSEBUTTONUPMASK:
                    if(event.button.button==SDL_BUTTON_LEFT)
                    {
                        PionB16=SDL_LoadBMP("pion_blanc.bmp");
                        positionPionB16.x=event.button.x;
                        positionPionB16.y=event.button.y;
                        SDL_BlitSurface(PionB16,NULL,fenetre,&positionPionB16);
                        break;
                    }
                }
            • Partager sur Facebook
            • Partager sur Twitter
              7 avril 2017 à 22:57:20

              Bonjour,

              La bonne structure est la suivante:

              Init();			 // Chargement des surfaces
              
              while (continuer)
              {
                  while (SDL_PollEvent(&event))
                  {
                      switch(event.type)  // Traitement des évènements
                      {
                        // ..
                      }
                  }
              
                  Actualisation();	// Mise à jour des positions en fonction du traitement des évènements
                  Affichage();	// Blit puis Flip
                  GesFrame();		// Gestion du nombre d'affichages / seconde
              
              }
              
              Fin();			// Free, Quit ...
              



              Avec un while{} pour PollEvent et un seul switch à l'intérieur.

              C'était pas mal parti avec le if(souris) ...

              Si tu veux déplacer le pion avec la souris pendant le clic, il faut mettre cette partie à l'intérieur du case  SDL_MOUSEMOTION

              -
              Edité par picosoft 8 avril 2017 à 11:08:31

              • Partager sur Facebook
              • Partager sur Twitter
              Architecture SDL                     Multithreading         
                10 avril 2017 à 11:14:54

                Merci,

                cette fois ci l'objet (qui est en fait une image) se déplace bien, mais quand je clique dans ma fenêtre pour déplacer mon objet, l'objet à  sa position précédente est toujours présente et au final j'ai deux objets à deux positions différentes et ainsi de suite.

                • Partager sur Facebook
                • Partager sur Twitter
                  10 avril 2017 à 12:19:25

                  Hello,

                  Tu cliques sur l'objet, et tu le déplaces. Ok. Si l'endroit où tu déposes ton objet est un endroit valide (suivant les règles de ton jeu), alors tu dois

                  • blitter l'objet au nouvel endroit
                  • effacer l'objet là où il était (=blitter une 'case' vide, de couleur, avec un motif, etc)
                  • afficher le tout (sdl_flip ou 2 x sdl_updateRect, au choix)
                  • 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

                  SDL

                  × 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