Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] Blittage conditionnel

    27 décembre 2007 à 12:19:01

    Salut !

    J'aimerai faire un effet de hover sur le menu principal de mon jeu. J'ai réussi à blitter une image différente que celle d'origine, mais celle-ci clignote quand on bouge la souris. De plus, l'image disparaît toute seule, même quand la souris reste au même endroit.
    En fait, j'aimmerai que l'image ne disparaisse pas toute seule et ne se reblitte pas quand la souris bouge sur la surface.

    Pouvez-vous (encore) m'aider à résoudre ce problème ?

    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      27 décembre 2007 à 12:23:28

      il y a de toute évidence un probleme de gestion de blit et de flip.

      La regle :
      blit tout ce que tu veux, puis flip qu'une seule fois.
      • Partager sur Facebook
      • Partager sur Twitter

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

        27 décembre 2007 à 17:57:00

        >en compris. Je poste le code :
        1. bool menu(bool menuBoucle, SDL_Surface *ecran)
        2. {
        3.     // Surfaces des boutons
        4.     SDL_Surface *BTN_jouer_init = NULL,
        5.                 *BTN_jouer_hover = NULL,
        6.                 *BTN_jouer_clic = NULL,
        7.                 *BTN_scores_init = NULL,
        8.                 *BTN_scores_hover = NULL,
        9.                 *BTN_scores_clic = NULL,
        10.                 *BTN_aide_init = NULL,
        11.                 *BTN_aide_hover = NULL,
        12.                 *BTN_aide_clic = NULL,
        13.                 *BTN_options_init = NULL,
        14.                 *BTN_options_hover = NULL,
        15.                 *BTN_options_clic = NULL,
        16.                 *BTN_quitter_init = NULL,
        17.                 *BTN_quitter_hover = NULL,
        18.                 *BTN_quitter_clic = NULL;
        19.     // Images des boutons
        20.     BTN_jouer_init = SDL_LoadBMP("images/BTN_init.bmp");
        21.     BTN_jouer_hover = SDL_LoadBMP("images/BTN_hover.bmp");
        22.     BTN_jouer_clic = SDL_LoadBMP("images/BTN_clic.bmp");
        23.     BTN_scores_init = SDL_LoadBMP("images/BTN_init.bmp");
        24.     BTN_scores_hover = SDL_LoadBMP("images/BTN_hover.bmp");
        25.     BTN_scores_clic = SDL_LoadBMP("images/BTN_clic.bmp");
        26.     BTN_aide_init = SDL_LoadBMP("images/BTN_init.bmp");
        27.     BTN_aide_hover = SDL_LoadBMP("images/BTN_hover.bmp");
        28.     BTN_aide_clic = SDL_LoadBMP("images/BTN_clic.bmp");
        29.     BTN_options_init = SDL_LoadBMP("images/BTN_init.bmp");
        30.     BTN_options_hover = SDL_LoadBMP("images/BTN_hover.bmp");
        31.     BTN_options_clic = SDL_LoadBMP("images/BTN_clic.bmp");
        32.     BTN_quitter_init = SDL_LoadBMP("images/BTN_init.bmp");
        33.     BTN_quitter_hover = SDL_LoadBMP("images/BTN_hover.bmp");
        34.     BTN_quitter_clic = SDL_LoadBMP("images/BTN_clic.bmp");
        35.     // Coordonnées des boutons
        36.     SDL_Rect BTN_jouer,
        37.              BTN_scores,
        38.              BTN_aide,
        39.              BTN_options,
        40.              BTN_quitter;
        41.         BTN_jouer.x = 412;
        42.         BTN_jouer.y = 400;
        43.         BTN_scores.x = 412;
        44.         BTN_scores.y = 450;
        45.         BTN_aide.x = 412;
        46.         BTN_aide.y = 500;
        47.         BTN_options.x = 412;
        48.         BTN_options.y = 550;
        49.         BTN_quitter.x = 412;
        50.         BTN_quitter.y = 600;
        51.     SDL_BlitSurface(BTN_jouer_init, NULL, ecran, &BTN_jouer);
        52.     SDL_BlitSurface(BTN_scores_init, NULL, ecran, &BTN_scores);
        53.     SDL_BlitSurface(BTN_aide_init, NULL, ecran, &BTN_aide);
        54.     SDL_BlitSurface(BTN_options_init, NULL, ecran, &BTN_options);
        55.     SDL_BlitSurface(BTN_quitter_init, NULL, ecran, &BTN_quitter);
        56.     SDL_Flip(ecran);
        57.     SDL_Event menu_principal;
        58.     SDL_WaitEvent(&menu_principal);
        59.     switch(menu_principal.type)
        60.     {
        61.         case SDL_QUIT:
        62.         {
        63.             menuBoucle = false;
        64.             return menuBoucle;
        65.         }
        66.         case SDL_MOUSEBUTTONUP: // Clic complet
        67.         {
        68.             if (menu_principal.button.button == SDL_BUTTON_LEFT || SDL_BUTTON_RIGHT)
        69.             {
        70.                 // Bouton JOUER
        71.                 if (menu_principal.button.x >= 412
        72.                     && menu_principal.button.x <= 612
        73.                     && menu_principal.button.y <= 440
        74.                     && menu_principal.button.y >= 400)
        75.                 {
        76.                     jeu2d();
        77.                 }
        78.                 // Bouton SCORES
        79.                 if (menu_principal.button.x >= 412
        80.                     && menu_principal.button.x <= 612
        81.                     && menu_principal.button.y <= 490
        82.                     && menu_principal.button.y >= 450)
        83.                 {
        84.                     exit(EXIT_SUCCESS);
        85.                 }
        86.                 // Bouton AIDE
        87.                 if (menu_principal.button.x >= 412
        88.                     && menu_principal.button.x <= 612
        89.                     && menu_principal.button.y <= 540
        90.                     && menu_principal.button.y >= 500)
        91.                 {
        92.                     exit(EXIT_SUCCESS);
        93.                 }
        94.                 // Bouton OPTIONS
        95.                 if (menu_principal.button.x >= 412
        96.                     && menu_principal.button.x <= 612
        97.                     && menu_principal.button.y <= 590
        98.                     && menu_principal.button.y >= 550)
        99.                 {
        100.                     exit(EXIT_SUCCESS);
        101.                 }
        102.                 // Bouton QUITTER
        103.                 if (menu_principal.button.x >= 412
        104.                     && menu_principal.button.x <= 612
        105.                     && menu_principal.button.y <= 640
        106.                     && menu_principal.button.y >= 600)
        107.                 {
        108.                     exit(EXIT_SUCCESS);
        109.                 }
        110.             }
        111.         }
        112.         case SDL_MOUSEBUTTONDOWN: // Souris enfonçée
        113.         {
        114.             if (menu_principal.button.button == SDL_BUTTON_LEFT || SDL_BUTTON_RIGHT)
        115.             {
        116.                 // Bouton JOUER
        117.                 if (menu_principal.button.x >= 412
        118.                     && menu_principal.button.x <= 612
        119.                     && menu_principal.button.y <= 440
        120.                     && menu_principal.button.y >= 400)
        121.                 {
        122.                     SDL_BlitSurface(BTN_jouer_clic, NULL, ecran, &BTN_jouer);
        123.                     SDL_Flip(ecran);
        124.                 }
        125.                 // Bouton SCORES
        126.                 if (menu_principal.button.x >= 412
        127.                     && menu_principal.button.x <= 612
        128.                     && menu_principal.button.y <= 490
        129.                     && menu_principal.button.y >= 450)
        130.                 {
        131.                     SDL_BlitSurface(BTN_scores_clic, NULL, ecran, &BTN_scores);
        132.                     SDL_Flip(ecran);
        133.                 }
        134.                 // Bouton AIDE
        135.                 if (menu_principal.button.x >= 412
        136.                     && menu_principal.button.x <= 612
        137.                     && menu_principal.button.y <= 540
        138.                     && menu_principal.button.y >= 500)
        139.                 {
        140.                     SDL_BlitSurface(BTN_aide_clic, NULL, ecran, &BTN_aide);
        141.                     SDL_Flip(ecran);
        142.                 }
        143.                 // Bouton OPTIONS
        144.                 if (menu_principal.button.x >= 412
        145.                     && menu_principal.button.x <= 612
        146.                     && menu_principal.button.y <= 590
        147.                     && menu_principal.button.y >= 540)
        148.                 {
        149.                     SDL_BlitSurface(BTN_options_clic, NULL, ecran, &BTN_options);
        150.                     SDL_Flip(ecran);
        151.                 }
        152.                 // Bouton QUITTER
        153.                 if (menu_principal.button.x >= 412
        154.                     && menu_principal.button.x <= 612
        155.                     && menu_principal.button.y <= 640
        156.                     && menu_principal.button.y >= 600)
        157.                 {
        158.                     SDL_BlitSurface(BTN_quitter_clic, NULL, ecran, &BTN_quitter);
        159.                     SDL_Flip(ecran);
        160.                 }
        161.             }
        162.         }
        163.         case SDL_MOUSEMOTION: // Survol des boutons
        164.         {
        165.             // Bouton JOUER
        166.             if (menu_principal.button.x >= 412
        167.                 && menu_principal.button.x <= 612
        168.                 && menu_principal.button.y <= 440
        169.                 && menu_principal.button.y >= 400)
        170.             {
        171.                 SDL_BlitSurface(BTN_jouer_hover, NULL, ecran, &BTN_jouer);
        172.                 SDL_Flip(ecran);
        173.             }
        174.             // Bouton SCORES
        175.             if (menu_principal.button.x >= 412
        176.                 && menu_principal.button.x <= 612
        177.                 && menu_principal.button.y <= 490
        178.                 && menu_principal.button.y >= 450)
        179.             {
        180.                 SDL_BlitSurface(BTN_scores_hover, NULL, ecran, &BTN_scores);
        181.                 SDL_Flip(ecran);
        182.             }
        183.             // Bouton AIDE
        184.             if (menu_principal.button.x >= 412
        185.                 && menu_principal.button.x <= 612
        186.                 && menu_principal.button.y <= 540
        187.                 && menu_principal.button.y >= 500)
        188.             {
        189.                 SDL_BlitSurface(BTN_aide_hover, NULL, ecran, &BTN_aide);
        190.                 SDL_Flip(ecran);
        191.             }
        192.             // Bouton OPTIONS
        193.             if (menu_principal.button.x >= 412
        194.                 && menu_principal.button.x <= 612
        195.                 && menu_principal.button.y <= 590
        196.                 && menu_principal.button.y >= 550)
        197.             {
        198.                 SDL_BlitSurface(BTN_options_hover, NULL, ecran, &BTN_options);
        199.                 SDL_Flip(ecran);
        200.             }
        201.             // Bouton QUITTER
        202.             if (menu_principal.button.x >= 412
        203.                 && menu_principal.button.x <= 612
        204.                 && menu_principal.button.y <= 640
        205.                 && menu_principal.button.y >= 600)
        206.             {
        207.                 SDL_BlitSurface(BTN_quitter_hover, NULL, ecran, &BTN_quitter);
        208.                 SDL_Flip(ecran);
        209.             }
        210.         }
        211.     }
        212. }
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          28 décembre 2007 à 14:31:48

          Ton "blittage" ne se fait que quand l'utilisateur bouge la souris. Ce n'est pas ça que tu veux. Il faut donc sortir le "blittage conditionnel" du switch, c'est-à-dire que ton programme doit controler la position de la souris à chaque frame.

          Je ne sais plus si, avec la SDL, on peut récupérer la position de la souris indépendamment des évènements. Si c'est la cas, la correction du code sera très facile.

          Citation : Fvirtman

          La regle :
          blit tout ce que tu veux, puis flip qu'une seule fois.


          En effet, il faut que tu "flip" à la fin de la gestion des évènements, pour chaque frame une seule fois.
          • Partager sur Facebook
          • Partager sur Twitter
            28 décembre 2007 à 14:36:15

            j'ai envie de dire :

            c'est cela de travailler (faire des blit, bouger des coordonnées, etc) dans le switch de gestion d'events !

            Isolez les events une fois pour toutes de toute le reste !!
            • Partager sur Facebook
            • Partager sur Twitter

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

            Anonyme
              28 décembre 2007 à 14:55:28

              Après une petite recherche dans la doc :
              1. //Juste après le switch :
              2.         int x = 0, y = 0;
              3.         SDL_GetMouseState(&x, &y);
              4.         // Bouton JOUER
              5.         if (x >= 412
              6.             && x <= 612
              7.             && y <= 440
              8.             && y >= 400)
              9.         {
              10.             SDL_BlitSurface(BTN_jouer_hover, NULL, ecran, &BTN_jouer);
              11.         }
              12.         // Bouton SCORES
              13.         if (x >= 412
              14.             && x <= 612
              15.             && y <= 490
              16.             && y >= 450)
              17.         {
              18.             SDL_BlitSurface(BTN_scores_hover, NULL, ecran, &BTN_scores);
              19.         }
              20.         // Bouton AIDE
              21.         if (x >= 412
              22.             && x <= 612
              23.             && y <= 540
              24.             && y >= 500)
              25.         {
              26.             SDL_BlitSurface(BTN_aide_hover, NULL, ecran, &BTN_aide);
              27.         }
              28.         // Bouton OPTIONS
              29.         if (x >= 412
              30.             && x <= 612
              31.             && y <= 590
              32.             && y >= 550)
              33.         {
              34.             SDL_BlitSurface(BTN_options_hover, NULL, ecran, &BTN_options);
              35.         }
              36.         // Bouton QUITTER
              37.         if (x >= 412
              38.             && x <= 612
              39.             && y <= 640
              40.             && y >= 600)
              41.         {
              42.             SDL_BlitSurface(BTN_quitter_hover, NULL, ecran, &BTN_quitter);
              43.         }
              44.         // Actualisation de l'écran à la fin
              45.         SDL_Flip(ecran);

              En effet, le mieux serait de séparer la gestion des évènements du traitement graphique.

              Encore autre chose : dans cette fonction tu n'as pas de boucle évènementielle. Je suppose que cette fonction est exécutée en boucle jusqu'à ce qu'elle renvoie "false" ? Dans ce cas-là tu perds beaucoup de performances : toutes tes images ne sont-elles pas rechargées à chaque nouvel évènement (à moins que la SDL soit suffisamment intelligene pour ne charger qu'une seule fois la même image ) ?
              • Partager sur Facebook
              • Partager sur Twitter

              [SDL] Blittage conditionnel

              × 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