Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] Blit'n'flip , surcharge de blit = programme foireux

Comment "unbliter" ?

Sujet résolu
    20 juillet 2007 à 9:53:13

    Bonjour les 0 !

    J'ai fait un programme C++ avec la librairie C <SDL>.
    J'ai un décors. Pour ce, je blit environ 6images. Ce décors est statique.
    Par contre, dans mon programme, je crée aussi un nuage qui lui, est dynamique. Je dois donc le changer de position 30x par seconde.
    Pour ce, j'utilise la même méthode que m@theo21, dans son cours ou il faut bouger Zozor selon le temps.

    Dans ma boucle infini d'events, je met la surface *ecran blanche, ensuite je reblite le décors, puis je reblit le nuage en prenant bien soin d'augmenter sa position x de 1px à chaque fois.

    Le problème, c'est que j'ai juste besoin de rebliter le nuage, comme le décors est statique, c'est très superflu de le reblitter.

    Le truc c'est que si je reblit que le nuage à chaque fois, le(s) ancien(s) blittages du nuages ne s'enlèvent pas! Ce qui crée une sorte de trénée de nuage derrière ce-dernier.

    Voilà ma question:

    Comment debliter une image???

    Et comme une question ne vient jamais seule:

    Vous savez comment faire pour blitter une image avec des cordonnées de position négatives? Où une fonction pour couper l'image.


    Cordialement, fredleshaman.

    EDIT: pardon, me suis trompé de catégorie, un admin pourrait me le déplasser en catégorie C please?
    • Partager sur Facebook
    • Partager sur Twitter
      20 juillet 2007 à 10:26:27

      Comment déblité une image?
      Tu mets ta variable contenant l'image à NULL.

      Pour l'autre question, il est un peu plus difficile pour moi d'y répondre. Je laisse la place aux autres.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        20 juillet 2007 à 11:12:14

        Bonjour!

        Pour débliter, alors je ne pense pas que ce soit juste ce que gogeta1 a dit. (Je dis ça mais je n'ai pas testé.)
        Ma théorie c'est que tu blit une surface sur une autre, en d'autre terme tu modifie la surface de destination. Donc simplement supprimer une image comme tu le proposes ne servirais à rien.

        A mon avis débliter une surface n'est poas possible (ou du moins de manière rapide et simple).

        Ensuite pour ta deuxième question, lis la doc officielle sur la fonction "SDL_BlitSurface". En particulier son deuxième paramètre.

        Il y a déjà pas mal de topic sur ce sujet dans le forum C sauf erreur.

        Voilà A bientôt
        Hiura
        • Partager sur Facebook
        • Partager sur Twitter
          20 juillet 2007 à 11:14:33

          "déblitter"
          --> Cela voudrait dire que quand tu blit, tu consideres qu'on peut annuler, donc retrouver ce qu'il y avait en dessous.

          C'est pas bon : des que tu blit, tu écrases ce qu'il y avait en dessous.
          Donc soit tu reblittes tout (ce que je te conseille de toute façon)
          Soit tu reblit partiellement le décor sur la position ou était le nuage : en gros, tu reblit un bout de décor au bon endroit :)
          Dans tous les cas : tu blit de nouveau. On ne peut pas "annuler" un blit.

          Pur ta deuxieme question, pour Blitter, on passe un SDL_Rect : les coordonnées x et y du SDL_Rect sont des Sint16 --> Signed int.
          Donc tu peux tout a fait blitter en négatif : le clipping de l'écran est géré en interne par SDL.
          par contre, et c'est peut etre ce qui te pose probleme, c'est que SDL modifie le SDL_Rect que tu as passé, et remet x=y=0 s'ils étaient négatifs.
          --> Donc garde a part un x et un y.

          Autrement, si tu veux faire un clipping de n'importe ou, le Blit te permet aussi de blitter un bout d'image uniquement :)
          • Partager sur Facebook
          • Partager sur Twitter

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

            21 juillet 2007 à 13:15:07

            Pour éviter la traînée de nuages, tu dois à chaque fois redessiner ton écran.

            Blit(les 6 surfaces de ton écran);
            posNuage.x++;
            Blit(nuage);
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));

            Je pense qu'il te sera préférable d'activer le double buffering avec le flag SDL_DOUBLEBUF lors de l'appel à SDL_SetVideoMode.
            • Partager sur Facebook
            • Partager sur Twitter
              21 juillet 2007 à 18:01:23

              Ui, mais ya un décors que je dois reblitter si je reremplit la surface.

              Mais merci de vos réponses, mon programme fonctionne enfin.

              Ce qui m'a mis dans l'erreur c'est que quand je regardait le gestionnaire de tâches, je voyais le CPU utilisé augmenté sec après secondes... Et donc je me suis dit: blit = rajout d'une surface sur une autre, et pas "écraser" une surface avec une autre.

              Bon, merci bcp!

              (Pour les curieux, voici le prog(il est pas fini): http://www.wigaab.com/chat.zip )

              Cordialement, Fred.
              • Partager sur Facebook
              • Partager sur Twitter

              [SDL] Blit'n'flip , surcharge de blit = programme foireux

              × 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