ScrollAreaGadget et Image

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

ScrollAreaGadget et Image

Message par garzul »

Bonjour !

Je suis en train de crée un petit éditeur de map pour un jeu que je crée en C/C++ , mais j'ai un probléme au niveau des chargements de chipsets ! Je ne peux ouvrir qu'un chipset ( image ) et je n'arrive pas à libérer la derniére image utilisé de la mémoire !

J'ai essayé d'utiliser freeImage() mais ca n'as pas l'air de marcher !

Voici le bout de code que j'utilise pour ouvrir un chipset ! Pour infos j'utilise UsePNGImageDecoder() et UseJPEGImageDecoder() .

Code : Tout sélectionner

    ; - Chargement des chipsets par clic sur le bouton charger chipset de la toolbar
    ElseIf MenuID = #ToolBarChargerChipset
    
      Chipset$ = OpenFileRequester("Choisissez un chipset à charger :","","Fichiers Chipsets|*.png;*.bmp;*.jpg",0) 
        
        If Chipset$
          
          #position_scrolling = 0
          case_chipset = LoadImage(#ChipsetPNG,Chipset$)
          UseImage(#ChipsetPNG)
          Dim image(10000)
          l_image      = ImageWidth()
          h_image      = ImageHeight()
          cal_l_image  = l_image
          cal_h_image  = h_image
    
  
            If l_image >= 32 And h_image >= 32 

              Repeat
                
                image(i) = GrabImage(#ChipsetPNG,#PB_Any, x, y,32,32) 
                UseImage(image(i))
                
                OpenGadgetList(#AREACHIP)
                  ImageGadget(#PB_Any, x, y, 36, 36, UseImage(image(i)), #PB_Image_Border)
                CloseGadgetList()
                
                cal_chipset = i%5
                
                If cal_chipset = 0
                   case_chipset_x = 0
                   case_chipset_y+36
                Else
                   case_chipset_x+36
                EndIf
      
                cal_l_image-32
                x+32
                
                If cal_l_image = 0
                   cal_l_image = l_image
                   cal_h_image-32
                   x = 0
                   y+32
                EndIf
                i + 1

             Until i = 1000

             SendMessage_(GadgetID(#AREACHIP), #WM_VSCROLL, #SB_THUMBTRACK | (#position_scrolling << 16), 0)

           EndIf
    EndIf
En gros je voudrai pouvoir charger des images en utilisant la même procédure à chaque fois !

Je m'explique car je sent que je m'explique assez mal :D :

L'utilisateur veut ouvrir un chipset !
Il clic sur un menu "Ouvrir un chipset"
Un OpenFileRequester apparaît en lui disant de choisir son chipset .
Il le choisie et l'ouvre
Le chipset est placer dans le ScrollAreaGadget en case de 32 * 32
Il veut en ouvrir un autre car il s'est tromper !
Il reouvre un chipset
Et normalement ca devraît se mettre à la place de l'autre d'avant en case de 32 *32 comme l'autre mais en changeant de chipset quoi !
Mais la ca faît un gros bug de mon app vue que je libére pas l'ancienne image et je ne vois pas comment je peux la libérer !

J'ai faît un effort sur l'orthographe ;) !

@++
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

Humm personne peut m'aider ?
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

J'ai trouvé ! Maintenant je souhaite actualiser le gadget car si je bouge pas le truc pour scroller bah on voit les cases précedente en fond donc ca géne ( enfin l'image si vous preferez ! ) Humm j'ai trouver setgadgetstat mais ca ne marche pas :( ! Quelqu'un à une idée ?
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

Regardez ce que mon scrollareagadget faît quand on ouvre 1 chipset puis un autre ! ( 2 chipsets sont disponible dans le rép data de l'éditeur ) ==> http://garzul.tonsite.biz/DOM/ed.zip

pour infos l'interface de l'éditeur est repris de l'éditeur de Gratteur !
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

hummm vraiment personnes pour m'aider à corriger ce bug svp ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ya comme un probeme de rafraichissement !!

ya un truc qui doit marcher , c'est lorsque le gars vient de charger un chipset
(dans la routine se chargeant de charger ) , tu redimentione ton scrool area
une fois en lui mettant 1 pixel de haut , (meme largeur) , tu joue que sur la hauteur , et ensuite tu lui redonne la taille que tu lui a donné au debut

ceci bien a la suite --< tu reduit la hauteur , tu rallonge !!
cela aura pour effet de forcer un "redraw" de la fenetre , et de son contenu

le petit defaut du truc c'est qu'a chaque chargement d'un chipset , ton
scrollarea va sintiller ! , mais le resultat devrai convenir ! :D
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

Super Dobro ca marche mais en faîte quand je recharge un autre chipset bah le résultat c'est que l'autre chipset ouvert derniérement apparaît derriére et quand je bouge mon scroll il apparait aussi donc a priori ils ne sont pas effacé mais comment faire ? voici le code :

Code : Tout sélectionner

; - Charge un chipset
Procedure OpenChipset()

      Chipset$ = OpenFileRequester("Choisissez un chipset à charger :","data\Chipsets\","Fichiers Chipsets|*.png;*.bmp;*.jpg",0)
       
        If Chipset$
       
          #position_scrolling = 0
     
          ;FreeImage(#ChipsetPNG)
          If IsImage(case_chipset)
            FreeImage(case_chipset)
          EndIf 
          
          case_chipset = LoadImage(#ChipsetPNG,Chipset$)
          i              = 0
          x              = 0
          y              = 0
          case_chipset_x = 0
          case_chipset_y = 0
          l_image        = ImageWidth()
          h_image        = ImageHeight()
          cal_l_image    = l_image
          cal_h_image    = h_image
          
          ;ResizeGadget(#AREACHIP,0,28, 205,504)
          ;ResizeGadget(#AREACHIP,0,27, 205,504)
          
          
            If l_image >= 32 And h_image >= 32

              Repeat
                
                ;For ImageGadgetg(i) = 0 To ImageGadgetg(i)
                
                
               ; Next ImageGadgetg(i)
                
                image(i) = GrabImage(#ChipsetPNG,#PB_Any, x, y,32,32)
                
                OpenGadgetList(#AREACHIP)
                     ImageGadgetg(i) = ImageGadget(#PB_Any, x, y, 36, 36, UseImage(image(i)), #PB_Image_Border)
                CloseGadgetList()
               
                cal_chipset = i%5
               
                If cal_chipset    = 0
                   case_chipset_x = 0
                   case_chipset_y + 32
                Else
                   case_chipset_x + 32
                EndIf
     
                cal_l_image-32
                x + 32
               
                If cal_l_image = 0
                   cal_l_image = l_image
                   cal_h_image-32
                   x = 0
                   y + 32
                EndIf
                i + 1
                
                ;ResizeGadget(#AREACHIP,0,27, 205,506)
                ;ResizeGadget(#AREACHIP,0,27, 205,504)
          
                UpdateWindow_(GadgetID(#AREACHIP))
                
             Until i = 1000

             SendMessage_(GadgetID(#AREACHIP), #WM_VSCROLL, #SB_THUMBTRACK | (#position_scrolling << 16), 0)
             
           EndIf
    EndIf  
EndProcedure
Répondre