Page 1 sur 1

Tile Editor

Publié : dim. 03/juin/2012 21:00
par blendman
salut

Je suis en train d'essayer de créer un petit tile Editor (j'ai besoin sur mon jeu et je n'ai rien trouvé qui m'ait plu, donc, j'essaye de le faire).

Mais je suis confronté à un problème bizarre. Sur mon essai, rien ne se dessine sur mon image (ou calque), pourtant, sur un autre code, ça marche avec la même technique.
savez-vous quel peut être le problème ?

Je souhaite dessiner sur l'image #IMAGE_LayerActif et non sur le canvas, pour pouvoir ensuite sauvegarder cette image, qui doit avoir un canal alpha :D.

merci :)

Code : Tout sélectionner

; basé sur un code de Fred/Fantaisie Software et de B.Vignoli

;{ enum

#win0=0
#menu=1
#maximages=1000

Enumeration; images
  #IMAGE_Content  ; stores the previous CanvasGadget content while the mouse is down
  #IMAGE_Color
  #IMAGE_LoadSave
  #IMAGE_Grid
  #IMAGE_LayerActif  
EndEnumeration

Enumeration
  #GADGET_Canvas
  #GADGET_Color 
  #GADGET_Brush
  #GADGET_Line
  #GADGET_Box
  #GADGET_Circle
  #GADGET_Fill
  #GADGET_Clear 
  #GADGET_BrushSize 
  #GADGET_Load
  #GADGET_Save
EndEnumeration

;}

;{ declare
Declare updateScreen() : Declare DrawAction(x, y, EventType) : Declare CreateCheckker()
Declare ClearCanvas() : Declare ClearLayer(img=#IMAGE_LayerActif)
Declare LoadImg() : Declare SaveImg()

;}

;{ structures
Structure option
  name$ : version$
EndStructure
Global option.option
With option
  \name$ ="Tile Editor"
  \version$ ="0.01"
EndWith

Structure StDocument
  w.w : h.w
EndStructure
Global Doc.StDocument
With doc
  \w = 1024-120
  \h = 768-100
EndWith

Structure StBrush
  Size.w : type.a
EndStructure
Global brush.StBrush
brush\Size =5
;}

;{ variables
Global Dim im(#maximages)
Global Dim imx(#maximages)
Global Dim imy(#maximages)
Dim img$(#maximages)

Global NbImgImport=0, sel=0
Global CurrentColor, CurrentMode, StartX, StartY
;}

;{ init
If UsePNGImageDecoder()=0 Or UsePNGImageEncoder()=0 Or UseJPEGImageDecoder()=0 Or UseTGAImageDecoder()=0 Or UseJPEGImageEncoder()=0 
  MessageRequester("Erreur","Impossible d'initialiser un des formats image (jpg, png, tga)!")
  End  
EndIf
;}

;{ openwindow
flag = #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget
If OpenWindow(#win0,0,0,1024,768,option\name$,flag)=0
  MessageRequester("Erreur","Impossible d'initialiser la fenêtre !")
  End
EndIf
;SmartWindowRefresh(#win0, #True)
;{ create menu
If CreateImageMenu(#menu,WindowID(#win0),#PB_Menu_ModernLook)
    MenuTitle("Fichier")
  MenuItem(0,"Ouvrir un tileset")
  MenuItem(1, "Importer des image(s)")
  MenuItem(6, "Ouvrir une image")
  MenuBar()
  MenuItem(7, "Sauvegarder l'image")
  ;MenuItem(2, "Exporter sequence d'images")
  ;MenuItem(3, "Exporter animation en Animstrip")
  MenuItem(5, "Exporter le tileSet")
  MenuBar()
  MenuItem(4, "Quitter")
  
  MenuTitle("Edition");21-40
  
  MenuItem(31, "Préférences")
  
  MenuTitle("Outil");41-60 
  OpenSubMenu("Type d'outil")       
  MenuItem(42, "Cercle")
  MenuItem(43, "Carré")
  CloseSubMenu()
  MenuItem(41, "Taille Pinceau")
  

  MenuTitle("Aide");121-140
  MenuItem(121, "Infos")
  MenuItem(122, "A propos...")
EndIf
;}
;{ image
CurrentColor = $000000
CurrentMode  = #GADGET_Brush
CreateImage(#IMAGE_Color, 25, 25, 24)
CreateImage(#IMAGE_Content, doc\w,doc\h, 32|#PB_Image_Transparent)
If CreateImage(#IMAGE_LayerActif,doc\w,doc\h,32|#PB_Image_Transparent)
EndIf
If  CreateImage(#IMAGE_Grid,doc\w,doc\h,32)
  CreateCheckker()
EndIf
;}
;{ gadgets
CanvasGadget(#GADGET_Canvas,60,50,doc\w,doc\h,#PB_Canvas_Border | #PB_Canvas_ClipMouse | #PB_Canvas_Keyboard)

ButtonImageGadget(#GADGET_Color, 00, 50, 30, 30, ImageID(#IMAGE_Color))
SpinGadget(#GADGET_BrushSize,0 , 80, 50,20,1,100,#PB_Spin_Numeric)
ButtonGadget(#GADGET_Brush,  00, 100, 50, 25, "Brush",  #PB_Button_Toggle)
ButtonGadget(#GADGET_Line,   00, 130, 50, 25, "Line",   #PB_Button_Toggle)
ButtonGadget(#GADGET_Box,    00, 160, 50, 25, "Box",    #PB_Button_Toggle)
ButtonGadget(#GADGET_Circle, 00, 190, 50, 25, "Circle", #PB_Button_Toggle)
ButtonGadget(#GADGET_Fill,   00, 220, 50, 25, "Fill",   #PB_Button_Toggle)
ButtonGadget(#GADGET_Clear,  00, 280, 50, 25, "Clear")

SetGadgetState(#GADGET_Brush, 1)
SetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Cursor, #PB_Cursor_Cross)
;}
updateScreen()
SetActiveGadget(#GADGET_Canvas)
take=0
;}

Repeat
  
  event=WaitWindowEvent(5) 
  
  Select event
      
    Case #PB_Event_Menu
      
      Select EventMenu()
          ;{ files
          ;{ importer une/des images
        Case 1 
          If NbImgImport<#maximages            
            NomFichier$=OpenFileRequester("Importer image(s)","","",0,#PB_Requester_MultiSelection)
            If NomFichier$<>"" And (GetExtensionPart(NomFichier$)="png" Or GetExtensionPart(NomFichier$)="bmp" Or GetExtensionPart(NomFichier$)="jpg" Or GetExtensionPart(NomFichier$)="tga")
              NbImgImport+1
              While NomFichier$<>""
                im(NbImgImport)=LoadImage(#PB_Any,NomFichier$)
                imx(NbImgImport)=0
                imy(NbImgImport)=0
                img$(NbImgImport)=NomFichier$
                NomFichier$ = NextSelectedFileName()
                If NomFichier$<>""
                  NbImgImport+1
                EndIf
                If NbImgImport>#maximages
                  NbImgImport=#maximages
                  Break
                EndIf
              Wend
              sel=1
              UpdateScreen()
            Else              
              If NomFichier$<>""
                MessageRequester("Erreur","Seuls les fichiers 'png/jpg/bmp/tga' sont autorisés !")
              EndIf
            EndIf
          EndIf ;}
          ;{ exportation en série d'images
        Case 2          
          If NbImgImport>0
            p$=PathRequester("Choisissez le répertoire d'exportation des images","")
            If p$<>""
              xleft=imx(1)
              xright=imx(1)+ImageWidth(im(1))-1
              yup=imy(1)
              ydown=imy(1)+ImageHeight(im(1))-1
              If xleft<0
                xleft=0
              EndIf
              If yup<0
                yup=0
              EndIf
              If xright>1023
                xright=1023
              EndIf
              If ydown>767
                ydown=767
              EndIf
              For i=2 To NbImgImport
                If imx(i)<xleft
                  xleft=imx(i)
                EndIf
                If imx(i)+ImageWidth(im(i))-1>xright
                  xright=imx(i)+ImageWidth(im(i))-1
                EndIf
                If imy(i)<yup
                  yup=imy(i)
                EndIf
                If imy(i)+ImageHeight(im(i))-1>ydown
                  ydown=imy(i)+ImageHeight(im(i))-1
                EndIf
                If xleft<0
                  xleft=0
                EndIf
                If yup<0
                  yup=0
                EndIf
                If xright>1023
                  xright=1023
                EndIf
                If ydown>767
                  ydown=767
                EndIf
                tempimg=CreateImage(#PB_Any,1024,768,32 | #PB_Image_Transparent)
                StartDrawing(ImageOutput(tempimg))
                DrawingMode(#PB_2DDrawing_AllChannels)
                DrawAlphaImage(ImageID(im(i)),imx(i),imy(i))
                StopDrawing()
                StartDrawing(ImageOutput(tempimg))
                xl=xleft
                For y=0 To 767
                  For x=0 To xl
                    If Alpha(Point(x,y))>0
                      If x<xleft
                        xleft=x
                      EndIf
                    EndIf
                  Next
                Next
                xr=xright
                For y=0 To 767
                  For x=1023 To xr Step -1
                    If Alpha(Point(x,y))>0
                      If x>xright
                        xright=x
                      EndIf
                    EndIf
                  Next
                Next
                yu=yup
                For x=0 To 1023
                  For y=0 To yu
                    If Alpha(Point(x,y))>0
                      If y<yup
                        yup=y
                      EndIf
                    EndIf
                  Next
                Next
                yd=ydown
                For x=0 To 1023
                  For y=767 To yd Step -1
                    If Alpha(Point(x,y))>0
                      If y>ydown
                        ydown=y
                      EndIf
                    EndIf
                  Next
                Next
                StopDrawing()
              Next
              For i=1 To NbImgImport
                tempimg=CreateImage(#PB_Any,1024,768,32 | #PB_Image_Transparent)
                StartDrawing(ImageOutput(tempimg))
                DrawingMode(#PB_2DDrawing_AllChannels)
                DrawAlphaImage(ImageID(im(i)),imx(i),imy(i))
                StopDrawing()
                tempimg2=GrabImage(tempimg,#PB_Any,xleft,yup,xright-xleft+1,ydown-yup+1)
                SaveImage(tempimg2,p$+GetFilePart(img$(i)),#PB_ImagePlugin_PNG)
                FreeImage(tempimg2)
                FreeImage(tempimg)
              Next
            EndIf
          EndIf
          ;}
          ;{ exporter 
        Case 3          
          If NbImgImport>1
            p$=SaveFileRequester("Choisissez le fichier animstrip à exporter","","",0)
            If GetExtensionPart(p$)=""
              p$=p$+".png"
            EndIf
            If p$<>"" And LCase(Right(p$,3))="png"
              xleft=imx(1)
              xright=imx(1)+ImageWidth(im(1))-1
              yup=imy(1)
              ydown=imy(1)+ImageHeight(im(1))-1
              If xleft<0
                xleft=0
              EndIf
              If yup<0
                yup=0
              EndIf
              If xright>1023
                xright=1023
              EndIf
              If ydown>767
                ydown=767
              EndIf
              For i=2 To NbImgImport
                If imx(i)<xleft
                  xleft=imx(i)
                EndIf
                If imx(i)+ImageWidth(im(i))-1>xright
                  xright=imx(i)+ImageWidth(im(i))-1
                EndIf
                If imy(i)<yup
                  yup=imy(i)
                EndIf
                If imy(i)+ImageHeight(im(i))-1>ydown
                  ydown=imy(i)+ImageHeight(im(i))-1
                EndIf
                If xleft<0
                  xleft=0
                EndIf
                If yup<0
                  yup=0
                EndIf
                If xright>1023
                  xright=1023
                EndIf
                If ydown>767
                  ydown=767
                EndIf
                tempimg=CreateImage(#PB_Any,1024,768,32 | #PB_Image_Transparent)
                StartDrawing(ImageOutput(tempimg))
                DrawingMode(#PB_2DDrawing_AllChannels)
                DrawAlphaImage(ImageID(im(i)),imx(i),imy(i))
                StopDrawing()
                StartDrawing(ImageOutput(tempimg))
                xl=xleft
                For y=0 To 767
                  For x=0 To xl
                    If Alpha(Point(x,y))>0
                      If x<xleft
                        xleft=x
                      EndIf
                    EndIf
                  Next
                Next
                xr=xright
                For y=0 To 767
                  For x=1023 To xr Step -1
                    If Alpha(Point(x,y))>0
                      If x>xright
                        xright=x
                      EndIf
                    EndIf
                  Next
                Next
                yu=yup
                For x=0 To 1023
                  For y=0 To yu
                    If Alpha(Point(x,y))>0
                      If y<yup
                        yup=y
                      EndIf
                    EndIf
                  Next
                Next
                yd=ydown
                For x=0 To 1023
                  For y=767 To yd Step -1
                    If Alpha(Point(x,y))>0
                      If y>ydown
                        ydown=y
                      EndIf
                    EndIf
                  Next
                Next
                StopDrawing()
              Next
              memi=1
              memj=NbImgImport
              iwidth=xright-xleft+1
              iheight=ydown-yup+1
              animstrip=CreateImage(#PB_Any,memi*iwidth,memj*iheight,32 | #PB_Image_Transparent)
              i=1
              For y=1 To memj
                For x=1 To memi
                  If i<=NbImgImport
                    tempimg=CreateImage(#PB_Any,1024,768,32 | #PB_Image_Transparent)
                    StartDrawing(ImageOutput(tempimg))
                    DrawingMode(#PB_2DDrawing_AllChannels)
                    DrawAlphaImage(ImageID(im(i)),imx(i),imy(i))
                    StopDrawing()
                    tempimg2=GrabImage(tempimg,#PB_Any,xleft,yup,iwidth,iheight)
                    StartDrawing(ImageOutput(animstrip))
                    DrawingMode(#PB_2DDrawing_AllChannels)
                    DrawAlphaImage(ImageID(tempimg2),(x-1)*iwidth,(y-1)*iheight)
                    StopDrawing()
                    FreeImage(tempimg2)
                    FreeImage(tempimg)
                  EndIf
                  i=i+1
                Next
              Next
              SaveImage(animstrip,p$,#PB_ImagePlugin_PNG)
              FreeImage(animstrip)
            Else
              If p$<>""
                MessageRequester("Erreur","Seuls les fichiers 'Png' sont autorisés !")
              EndIf
            EndIf
          EndIf;}
          ;{ open img
        Case 6 ; open img
          LoadImg()
          ;}
          ;{ save img
        Case 7 ; save img
          SaveImg()
          ;}
          ;{ quitter
        Case 4
          Break
          ;}
          ;}
          ;{ outils
        Case 41
          brush\Size=Val(InputRequester("Brush","Taille du Brush",Str(brush\Size)))
        Case 42
          brush\type =0
        Case 43
          brush\type =1
          ;}          
          ;{ menu Help
        Case 121
          txt$="Infos prochainement disponibles"
          MessageRequester("Infos",txt$)
        Case 122
          MessageRequester("A propos...","Tile Editor (version "+option\version$+")"+Chr(13)+"Développé par Blendman"+Chr(13)+Chr(13)+"Mai-2012"+Chr(13)+"Merci à B.Vignoli pour la base")
          ;}
      EndSelect
      
    Case #PB_Event_Gadget
    
      Select EventGadget()
          
        Case #GADGET_BrushSize
          brush\Size = GetGadgetState(#GADGET_BrushSize)
          
        Case #GADGET_Canvas
          X = GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_MouseX)
          Y = GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_MouseY)
          Type = EventType()
        
          Select EventType()
          
            Case #PB_EventType_LeftButtonDown              ;
              ; This stores the current content of the CanvasGadget in #IMAGE_Content,
              ; so it can be re-drawn while the mouse moves              ;
              If StartDrawing(ImageOutput(#IMAGE_Content))
                DrawImage(GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Image), 0, 0)
                StopDrawing()
              EndIf
              
              StartX = X
              StartY = Y
              DrawAction(X, Y, EventType())
            
            Case #PB_EventType_LeftButtonUp
              DrawAction(X, Y, EventType())                        
            
            Case #PB_EventType_MouseMove
              If GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
                DrawAction(X, Y, EventType())            
              EndIf
                      
          EndSelect
        
        Case #GADGET_Color
          CurrentColor = ColorRequester(CurrentColor)
          If StartDrawing(ImageOutput(#IMAGE_Color))
            Box(0, 0, 30,30, CurrentColor)
            StopDrawing()
            SetGadgetAttribute(#GADGET_Color, #PB_Button_Image, ImageID(#IMAGE_Color))
          EndIf
          
        Case #GADGET_Brush, #GADGET_Line, #GADGET_Box, #GADGET_Circle, #GADGET_Fill
          EventGadget = EventGadget()
          For Gadget = #GADGET_Brush To #GADGET_Fill
            If Gadget = EventGadget
              SetGadgetState(Gadget, 1) 
            Else
              SetGadgetState(Gadget, 0) ; unset the state of all other gadgets
            EndIf
          Next Gadget          
          CurrentMode = EventGadget             
      
        Case #GADGET_Clear
          ;ClearLayer()
          ClearCanvas()
          
      EndSelect 
      
      
  EndSelect  
  
Until event = #PB_Event_CloseWindow

;{ procedures
Procedure UpdateScreen()
;   If NbImgImport>0 And sel>0
;     SetWindowTitle(#win0,option\name$+"   ... "+Str(sel))
;   Else
;     SetWindowTitle(#win0,option\name$)
;   EndIf
  
  tempimg=CreateImage(#PB_Any,doc\w,doc\h)
  StartDrawing(ImageOutput(tempimg))
  DrawingMode(#PB_2DDrawing_Default)
  DrawImage(ImageID(#IMAGE_Grid),0,0)
  DrawingMode(#PB_2DDrawing_AlphaBlend)
  If sel>0
    DrawAlphaImage(ImageID(im(sel)),imx(sel),imy(sel))
  EndIf
  DrawAlphaImage(ImageID(#IMAGE_LayerActif),0,0)
  StopDrawing()
  
  StartDrawing(CanvasOutput(#GADGET_Canvas))
  DrawingMode(#PB_2DDrawing_Default)
  DrawImage(ImageID(tempimg),0,0)
  StopDrawing()
  FreeImage(tempimg)  
EndProcedure
Procedure ClearLayer(img=#IMAGE_LayerActif)
  If StartDrawing(ImageOutput(img))
    DrawingMode(#PB_2DDrawing_AlphaChannel)
    Box(0,0,doc\w,doc\h,RGBA(0,0,0,0)) 
    StopDrawing()
  EndIf 
EndProcedure
Procedure ClearCanvas()
  If StartDrawing(CanvasOutput(#GADGET_Canvas))
    DrawingMode(#PB_2DDrawing_Default)
    DrawImage(ImageID(#IMAGE_Grid),0,0)
    StopDrawing()
  EndIf
EndProcedure

Procedure UpdateCanvas()
  If StartDrawing(CanvasOutput(#GADGET_Canvas))
    ;DrawingMode(#PB_2DDrawing_AlphaChannel)
    ;Box(0,0,doc\w,doc\h,RGBA(0,0,0,0))
    ;DrawingMode(#PB_2DDrawing_AlphaBlend)
    DrawAlphaImage(ImageID(#IMAGE_LayerActif),0,0)
    StopDrawing()
  EndIf
EndProcedure

Procedure CreateCheckker()
  If StartDrawing(ImageOutput(#IMAGE_Grid))    
    c=255
    For y=0 To 767 Step 16
      For x=0 To 1023 Step 16
        Box(x,y,16,16,RGBA(c,c,c,255))
        If c=255
          c=192
        Else
          c=255
        EndIf
      Next
      If c=255
        c=192
      Else
        c=255
      EndIf
    Next
    StopDrawing()
  EndIf
EndProcedure
Procedure DrawAction(x, y, EventType)
  ;If StartDrawing(CanvasOutput(#GADGET_Canvas)) ; ça, ça marche, mais c'es tpas ça que je veux :)
  If StartDrawing(ImageOutput(#IMAGE_LayerActif))
    ;DrawingMode(#PB_2DDrawing_AllChannels)
    Select CurrentMode
    
      Case #GADGET_Brush        
        If EventType = #PB_EventType_LeftButtonDown Or EventType = #PB_EventType_MouseMove
          Select brush\type
              
              Case 0 ; cercle
                Circle(x, y, brush\Size, CurrentColor)
                
              Case 1; carré
                Box(x-brush\Size/2,y-brush\Size/2,brush\Size/2,brush\Size/2,CurrentColor)
                
              Case 2
                
            EndSelect            
        EndIf
        
      Case #GADGET_Line
        DrawImage(ImageID(#IMAGE_Content), 0, 0)
        LineXY(StartX, StartY, x, y, CurrentColor)
      
      Case #GADGET_Box
        DrawImage(ImageID(#IMAGE_Content), 0, 0)
        Box(StartX, StartY, x-StartX, y-StartY, CurrentColor)
        
      Case #GADGET_Circle
        DrawImage(ImageID(#IMAGE_Content), 0, 0)        
        If x > StartX
          rx = x - StartX
        Else
          rx = StartX - x
        EndIf
        
        If y > StartY
          ry = y - StartY
        Else
          ry = StartY - y
        EndIf
        
        If GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Modifiers) & #PB_Canvas_Control
          ry = rx
        EndIf
        
        Ellipse(StartX, StartY, rx, ry, CurrentColor)
      
      Case #GADGET_Fill
        If EventType = #PB_EventType_LeftButtonDown
          FillArea(x, y, -1, CurrentColor)
        EndIf
  
    EndSelect
    StopDrawing()
  EndIf
  UpdateScreen()
  ;UpdateCanvas(); marche pas non plus
EndProcedure

; save, load
Procedure LoadImg()
  ; à revoir
  File$ = OpenFileRequester("Load Image...", "", "JPEG Images|*.jpeg|All Files|*.*", 0)
  If File$
    If LoadImage(#IMAGE_LoadSave, File$)
      If StartDrawing(CanvasOutput(#GADGET_Canvas))
        Box(0, 0,  doc\w, doc\h, $FFFFFF)
        DrawImage(ImageID(#IMAGE_LoadSave), 0, 0)
        StopDrawing()
      EndIf
      FreeImage(#IMAGE_LoadSave)
    Else
      MessageRequester("CanvasGadget", "Cannot load image: " + File$)
    EndIf
  EndIf
EndProcedure
Procedure SaveImg()
  File$ = SaveFileRequester("Save Image...", File$, "JPEG Images|*.jpeg|PNG Images|*.png", 0)
  If File$ And (FileSize(File$) = -1 Or MessageRequester("CanvasGadget", "Overwrite this file? " + File$, #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes)
    If CreateImage(#IMAGE_LoadSave,  doc\w, doc\h, 32|#PB_Image_Transparent) And StartDrawing(ImageOutput(#IMAGE_LoadSave))
      ;DrawImage(GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Image), 0, 0)
      DrawAlphaImage(ImageID(#IMAGE_LayerActif), 0, 0)
      StopDrawing()
      
      If SelectedFilePattern() = 0 ; jpg
        If SaveImage(#IMAGE_LoadSave, RemoveString(File$,".jpg")+".jpg", #PB_ImagePlugin_JPEG) = 0
          MessageRequester("CanvasGadget", "Cannot save image: " + File$)
        EndIf
      ElseIf SelectedFilePattern() = 1 ; png
        If SaveImage(#IMAGE_LoadSave, RemoveString(File$,".png")+".png", #PB_ImagePlugin_PNG) = 0
          MessageRequester("CanvasGadget", "Cannot save image: " + File$)
        EndIf
      EndIf
    EndIf
    
    If CreateImage(#IMAGE_LoadSave,  doc\w, doc\h, 32|#PB_Image_Transparent) And StartDrawing(ImageOutput(#IMAGE_LoadSave))
      ;DrawImage(GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Image), 0, 0)
      DrawAlphaImage(ImageID(#IMAGE_Content), 0, 0)
      StopDrawing()
      
      If SelectedFilePattern() = 0 ; jpg
        If SaveImage(#IMAGE_LoadSave, RemoveString(File$,".jpg")+".jpg", #PB_ImagePlugin_JPEG) = 0
          MessageRequester("CanvasGadget", "Cannot save image: " + File$)
        EndIf
      ElseIf SelectedFilePattern() = 1 ; png
        If SaveImage(#IMAGE_LoadSave, RemoveString(File$,".png")+".png", #PB_ImagePlugin_PNG) = 0
          MessageRequester("CanvasGadget", "Cannot save image: " + File$)
        EndIf
      EndIf
    EndIf      
    FreeImage(#IMAGE_LoadSave)
  EndIf        
EndProcedure
;}

Re: Tile Editor

Publié : lun. 04/juin/2012 10:57
par Demivec

Code : Tout sélectionner

;122
CurrentColor = RGBA(0, 0, 0, $FF) ;ajouter une valeur alpha

;475
If StartDrawing(ImageOutput(#IMAGE_Content))
                  DrawingMode(#PB_2DDrawing_AlphaBlend) ;CanvasGadget ne possède pas alpha
                  DrawImage(GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Image), 0, 0)
                StopDrawing()
              EndIf
              
              StartX = x
              StartY = y
              DrawAction(x, y, EventType())
              isMouseDown = #True  ; problèmes poignées de souris utilisée dans OpenFileRequester
            Case #PB_EventType_LeftButtonUp
              If isMouseDown
                DrawAction(x, y, EventType())                        
                isMouseDown = #False
              EndIf 


;498
If StartDrawing(ImageOutput(#IMAGE_LayerActif))
      DrawingMode(#PB_2DDrawing_AllChannels)

;595
CurrentColor = ColorRequester(CurrentColor)
CurrentColor = RGBA(Red(CurrentColor), Green(CurrentColor), Blue(CurrentColor), $FF) ;mis en alpha entièrement visible, par défaut est transparent

Re: Tile Editor

Publié : lun. 04/juin/2012 11:39
par blendman
salut

Merci beaucoup Demivec, ça m'a permi de résoudre ce problème et même d'ajouter des fonctions très pratiques :)

- gomme
- conserver l'alpha pendant qu'on dessine

J'ai encore un petit bug quand on change la couleur, faut que je vois d'où ça vient, mais sinon, ça commence à être sympathique je trouve :)

Code : Tout sélectionner

; basé sur un code de Fred/Fantaisie Software et de B.Vignoli
; Remerciements : Demivec

;{ enum

#win0=0
#menu=1
#maximages=1000

Enumeration; images
  #IMAGE_Content  ; stores the previous CanvasGadget content while the mouse is down
  #IMAGE_Color
  #IMAGE_LoadSave
  #IMAGE_Grid
  #IMAGE_LayerActif  
EndEnumeration

Enumeration ; gadgets  
  #GADGET_ScrollCanvas
  #GADGET_Canvas
  #GADGET_Color 
  #GADGET_Brush
  #GADGET_Line
  #GADGET_Box
  #GADGET_Circle
  #GADGET_Fill
  #GADGET_Clear 
  #GADGET_BrushSize 
  #GADGET_BrushType
  #GADGET_BrushTra 
  #GADGET_BrushTool
  #GADGET_BrushKeepAlpha
EndEnumeration

;}

;{ declare
Declare updateScreen() : Declare DrawAction(x, y, EventType) : Declare CreateCheckker()
Declare AddCanvas() : Declare ClearCanvas() 
Declare AddImage() : Declare ClearLayer(img=#IMAGE_LayerActif)
Declare LoadImg() : Declare SaveImg() : Declare ConvertImg() : Declare NewTileSet()
Declare WindowPref() :
Declare SetBrush() :
;}

;{ structures
Structure option ; the option of the program, document..
  name$ : version$
EndStructure

Structure StDocument ; the document (size, depth..)
  w.w : h.w
  w_def.w : h_def.w
EndStructure

Structure StBrush ; for the brush tool (size, type, color..)
  size.w : type.a : alpha.a : tool.a
  keepAlpha.a
EndStructure
;}

;{ variables
Global Dim im(#maximages)
Global Dim imx(#maximages)
Global Dim imy(#maximages)
Dim img$(#maximages)

Global NbImgImport=0, sel=0
Global CurrentColor, CurrentMode, StartX, StartY
;}

;{ init
If UsePNGImageDecoder()=0 Or UsePNGImageEncoder()=0 Or UseJPEGImageDecoder()=0 Or UseTGAImageDecoder()=0 Or UseJPEGImageEncoder()=0 
  MessageRequester("Erreur","Impossible d'initialiser un des formats image (jpg, png, tga)!")
  End  
EndIf

;{ initialisation
Global option.option
With option
  \name$ ="Tile Editor"
  \version$ ="0.01"
EndWith

Global Doc.StDocument
With doc
  \w = 800
  \h = 600
  \w_def = 800
  \h_def = 600
EndWith

Global brush.StBrush
With brush
  \size =5
  \alpha = 255
  \type =0
  \tool = 0
EndWith
;}

;}

;{ openwindow
flag = #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget
If OpenWindow(#win0,0,0,1024,768,option\name$,flag)=0
  MessageRequester("Erreur","Impossible d'initialiser la fenêtre !")
  End
EndIf
;SmartWindowRefresh(#win0, #True)
;{ create menu
If CreateImageMenu(#menu,WindowID(#win0),#PB_Menu_ModernLook)
  MenuTitle("Fichier")
  MenuItem(9, "New Tileset")
  MenuItem(10, "New Animation")
  MenuBar()
  MenuItem(0, "Open a tileset")
  MenuItem(9, "Open an image")
  MenuItem(6, "Importer une image sur le document")
  MenuItem(8, "Ouvrir une image et la convertir en TileSet")
  MenuBar()
  MenuItem(1, "Importer des image(s) (animation)")
  MenuBar()
  MenuItem(7, "Sauvegarder l'image")
  ;MenuItem(2, "Exporter sequence d'images")
  ;MenuItem(3, "Exporter animation en Animstrip")
  MenuItem(5, "Exporter le tileSet")
  MenuBar()
  MenuItem(4, "Quitter")
  
  MenuTitle("Edition");21-40  
  MenuItem(31, "Préférences")
  
  MenuTitle("View") ; 61 -90   
  MenuItem(61, "Zoom +")
  MenuItem(62, "Zoom -")
  OpenSubMenu("Zoom")  
  MenuItem(63, "Zoom 500%")
  MenuItem(64, "Zoom 400%")
  MenuItem(65, "Zoom 300%")
  MenuItem(66, "Zoom 200%")
  MenuItem(67, "Zoom 100%")
  MenuItem(68, "Zoom 50%")
  MenuItem(69, "Zoom 25%")
   CloseSubMenu()
  MenuBar()
  ; MenuTitle("Tools");41-60 
;   OpenSubMenu("Type d'outil")       
;   MenuItem(42, "Cercle")
;   MenuItem(43, "Carré")
;   MenuItem(44, "Custom")
;   CloseSubMenu()
;   MenuItem(41, "Taille Pinceau")
  

  MenuTitle("Aide");121-140
  MenuItem(121, "Infos")
  MenuItem(122, "A propos...")
EndIf
;}
;{ image
CurrentColor = RGBA(0, 0, 0, $FF) ;add alpha value
CurrentMode  = #GADGET_Brush
CreateImage(#IMAGE_Color, 25, 25, 24); pour la sélection de couleur
If  CreateImage(#IMAGE_Grid,doc\w,doc\h,32) ; le fond checker
  CreateCheckker()
EndIf
AddImage()
;}
;{ gadgets

;{ Tools bar top
ComboBoxGadget(#GADGET_BrushTool,5,5,40,20)
AddGadgetItem(#GADGET_BrushTool,0,"Brush")
AddGadgetItem(#GADGET_BrushTool,1,"Pencil")
AddGadgetItem(#GADGET_BrushTool,2,"Eraser")

ComboBoxGadget(#GADGET_BrushType,48,5,50,20)
AddGadgetItem(#GADGET_BrushType,0,"Circle")
AddGadgetItem(#GADGET_BrushType,1,"Box")
AddGadgetItem(#GADGET_BrushType,2,"Custom")
LoadFont(1,"Arial.ttf",7)
SetGadgetFont(#GADGET_BrushType,FontID(1))
SetGadgetFont(#GADGET_BrushTool,FontID(1))

SpinGadget(#GADGET_BrushSize,100 , 5, 50,20,1,100,#PB_Spin_Numeric)
GadgetToolTip(#GADGET_BrushSize,"Size of the brush")
TrackBarGadget(#GADGET_BrushTra,155 , 5, 100,20,0,255)
GadgetToolTip(#GADGET_BrushTra,"Transparence of the brush")
CheckBoxGadget(#GADGET_BrushKeepAlpha,260,5,75,20,"Keep Alpha")
;}
;{ canvas
AddCanvas()
;}
;{ tools (right)
ButtonGadget(#GADGET_Brush,  5, 110, 25, 25, "Brush",  #PB_Button_Toggle)
ButtonGadget(#GADGET_Line,   31, 110, 25, 25, "Line",   #PB_Button_Toggle)
ButtonGadget(#GADGET_Box,    5, 137, 25, 25, "Box",    #PB_Button_Toggle)
ButtonGadget(#GADGET_Circle, 31, 137, 25, 25, "Circle", #PB_Button_Toggle)
ButtonGadget(#GADGET_Fill,   5, 164, 25, 25, "Fill",   #PB_Button_Toggle)
ButtonGadget(#GADGET_Clear,  31, 164, 25, 25, "Clear")

ButtonImageGadget(#GADGET_Color, 5, 210, 30, 30, ImageID(#IMAGE_Color))
;}
;{ set gadget
SetGadgetState(#GADGET_Brush, 1)

SetGadgetState(#GADGET_BrushSize,brush\size)
SetGadgetState(#GADGET_BrushTra,brush\alpha)
SetGadgetState(#GADGET_BrushType,brush\type)
SetGadgetState(#GADGET_BrushTool,brush\tool)
SetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Cursor, #PB_Cursor_Cross)
;}
;}
updateScreen()
SetActiveGadget(#GADGET_Canvas)
take=0
;}

Repeat
  
  event=WaitWindowEvent(5) 
  
  Select event
      
    Case #PB_Event_Menu
      
      Select EventMenu()
          ;{ files
          ;{ new tileset
          Case 9
           NewTileSet()
          ;}
          ;{ new AnimSprite
          Case 10
          ;}
          ;{ importer une/des images
        Case 1 
          If NbImgImport<#maximages            
            NomFichier$=OpenFileRequester("Importer image(s)","","",0,#PB_Requester_MultiSelection)
            If NomFichier$<>"" And (GetExtensionPart(NomFichier$)="png" Or GetExtensionPart(NomFichier$)="bmp" Or GetExtensionPart(NomFichier$)="jpg" Or GetExtensionPart(NomFichier$)="tga")
              NbImgImport+1
              While NomFichier$<>""
                im(NbImgImport)=LoadImage(#PB_Any,NomFichier$)
                imx(NbImgImport)=0
                imy(NbImgImport)=0
                img$(NbImgImport)=NomFichier$
                NomFichier$ = NextSelectedFileName()
                If NomFichier$<>""
                  NbImgImport+1
                EndIf
                If NbImgImport>#maximages
                  NbImgImport=#maximages
                  Break
                EndIf
              Wend
              sel=1
              UpdateScreen()
            Else              
              If NomFichier$<>""
                MessageRequester("Erreur","Seuls les fichiers 'png/jpg/bmp/tga' sont autorisés !")
              EndIf
            EndIf
          EndIf ;}
          ;{ exportation en série d'images
        Case 2          
          If NbImgImport>0
            p$=PathRequester("Choisissez le répertoire d'exportation des images","")
            If p$<>""
              xleft=imx(1)
              xright=imx(1)+ImageWidth(im(1))-1
              yup=imy(1)
              ydown=imy(1)+ImageHeight(im(1))-1
              If xleft<0
                xleft=0
              EndIf
              If yup<0
                yup=0
              EndIf
              If xright>1023
                xright=1023
              EndIf
              If ydown>767
                ydown=767
              EndIf
              For i=2 To NbImgImport
                If imx(i)<xleft
                  xleft=imx(i)
                EndIf
                If imx(i)+ImageWidth(im(i))-1>xright
                  xright=imx(i)+ImageWidth(im(i))-1
                EndIf
                If imy(i)<yup
                  yup=imy(i)
                EndIf
                If imy(i)+ImageHeight(im(i))-1>ydown
                  ydown=imy(i)+ImageHeight(im(i))-1
                EndIf
                If xleft<0
                  xleft=0
                EndIf
                If yup<0
                  yup=0
                EndIf
                If xright>1023
                  xright=1023
                EndIf
                If ydown>767
                  ydown=767
                EndIf
                tempimg=CreateImage(#PB_Any,1024,768,32 | #PB_Image_Transparent)
                StartDrawing(ImageOutput(tempimg))
                DrawingMode(#PB_2DDrawing_AllChannels)
                DrawAlphaImage(ImageID(im(i)),imx(i),imy(i))
                StopDrawing()
                StartDrawing(ImageOutput(tempimg))
                xl=xleft
                For y=0 To 767
                  For x=0 To xl
                    If Alpha(Point(x,y))>0
                      If x<xleft
                        xleft=x
                      EndIf
                    EndIf
                  Next
                Next
                xr=xright
                For y=0 To 767
                  For x=1023 To xr Step -1
                    If Alpha(Point(x,y))>0
                      If x>xright
                        xright=x
                      EndIf
                    EndIf
                  Next
                Next
                yu=yup
                For x=0 To 1023
                  For y=0 To yu
                    If Alpha(Point(x,y))>0
                      If y<yup
                        yup=y
                      EndIf
                    EndIf
                  Next
                Next
                yd=ydown
                For x=0 To 1023
                  For y=767 To yd Step -1
                    If Alpha(Point(x,y))>0
                      If y>ydown
                        ydown=y
                      EndIf
                    EndIf
                  Next
                Next
                StopDrawing()
              Next
              For i=1 To NbImgImport
                tempimg=CreateImage(#PB_Any,1024,768,32 | #PB_Image_Transparent)
                StartDrawing(ImageOutput(tempimg))
                DrawingMode(#PB_2DDrawing_AllChannels)
                DrawAlphaImage(ImageID(im(i)),imx(i),imy(i))
                StopDrawing()
                tempimg2=GrabImage(tempimg,#PB_Any,xleft,yup,xright-xleft+1,ydown-yup+1)
                SaveImage(tempimg2,p$+GetFilePart(img$(i)),#PB_ImagePlugin_PNG)
                FreeImage(tempimg2)
                FreeImage(tempimg)
              Next
            EndIf
          EndIf
          ;}
          ;{ exporter 
        Case 3          
          If NbImgImport>1
            p$=SaveFileRequester("Choisissez le fichier animstrip à exporter","","",0)
            If GetExtensionPart(p$)=""
              p$=p$+".png"
            EndIf
            If p$<>"" And LCase(Right(p$,3))="png"
              xleft=imx(1)
              xright=imx(1)+ImageWidth(im(1))-1
              yup=imy(1)
              ydown=imy(1)+ImageHeight(im(1))-1
              If xleft<0
                xleft=0
              EndIf
              If yup<0
                yup=0
              EndIf
              If xright>1023
                xright=1023
              EndIf
              If ydown>767
                ydown=767
              EndIf
              For i=2 To NbImgImport
                If imx(i)<xleft
                  xleft=imx(i)
                EndIf
                If imx(i)+ImageWidth(im(i))-1>xright
                  xright=imx(i)+ImageWidth(im(i))-1
                EndIf
                If imy(i)<yup
                  yup=imy(i)
                EndIf
                If imy(i)+ImageHeight(im(i))-1>ydown
                  ydown=imy(i)+ImageHeight(im(i))-1
                EndIf
                If xleft<0
                  xleft=0
                EndIf
                If yup<0
                  yup=0
                EndIf
                If xright>1023
                  xright=1023
                EndIf
                If ydown>767
                  ydown=767
                EndIf
                tempimg=CreateImage(#PB_Any,1024,768,32 | #PB_Image_Transparent)
                StartDrawing(ImageOutput(tempimg))
                DrawingMode(#PB_2DDrawing_AllChannels)
                DrawAlphaImage(ImageID(im(i)),imx(i),imy(i))
                StopDrawing()
                StartDrawing(ImageOutput(tempimg))
                xl=xleft
                For y=0 To 767
                  For x=0 To xl
                    If Alpha(Point(x,y))>0
                      If x<xleft
                        xleft=x
                      EndIf
                    EndIf
                  Next
                Next
                xr=xright
                For y=0 To 767
                  For x=1023 To xr Step -1
                    If Alpha(Point(x,y))>0
                      If x>xright
                        xright=x
                      EndIf
                    EndIf
                  Next
                Next
                yu=yup
                For x=0 To 1023
                  For y=0 To yu
                    If Alpha(Point(x,y))>0
                      If y<yup
                        yup=y
                      EndIf
                    EndIf
                  Next
                Next
                yd=ydown
                For x=0 To 1023
                  For y=767 To yd Step -1
                    If Alpha(Point(x,y))>0
                      If y>ydown
                        ydown=y
                      EndIf
                    EndIf
                  Next
                Next
                StopDrawing()
              Next
              memi=1
              memj=NbImgImport
              iwidth=xright-xleft+1
              iheight=ydown-yup+1
              animstrip=CreateImage(#PB_Any,memi*iwidth,memj*iheight,32 | #PB_Image_Transparent)
              i=1
              For y=1 To memj
                For x=1 To memi
                  If i<=NbImgImport
                    tempimg=CreateImage(#PB_Any,1024,768,32 | #PB_Image_Transparent)
                    StartDrawing(ImageOutput(tempimg))
                    DrawingMode(#PB_2DDrawing_AllChannels)
                    DrawAlphaImage(ImageID(im(i)),imx(i),imy(i))
                    StopDrawing()
                    tempimg2=GrabImage(tempimg,#PB_Any,xleft,yup,iwidth,iheight)
                    StartDrawing(ImageOutput(animstrip))
                    DrawingMode(#PB_2DDrawing_AllChannels)
                    DrawAlphaImage(ImageID(tempimg2),(x-1)*iwidth,(y-1)*iheight)
                    StopDrawing()
                    FreeImage(tempimg2)
                    FreeImage(tempimg)
                  EndIf
                  i=i+1
                Next
              Next
              SaveImage(animstrip,p$,#PB_ImagePlugin_PNG)
              FreeImage(animstrip)
            Else
              If p$<>""
                MessageRequester("Erreur","Seuls les fichiers 'Png' sont autorisés !")
              EndIf
            EndIf
          EndIf;}
          ;{ open img
        Case 6 ; open img
          LoadImg()
          ;}
          ;{ save img
        Case 7 ; save img
          SaveImg()
          ;}
          ;{ convertion image tileset
        Case 8
          ConvertImg()
          ;}
          ;{ quitter
        Case 4
          Break
          ;}
          ;}
          ;{ Edition
        Case 31
          WindowPref()
          ;}          
          ;{ view
        Case 61 ; zoom +
          
        Case 62 ; zoom -
          
        Case 63 To 69
          MessageRequester("Info","Not Finished")
          ;}
          ;{ outils
        Case 41
          brush\Size=Val(InputRequester("Brush","Taille du Brush",Str(brush\Size)))
        Case 42
          brush\type =0
        Case 43
          brush\type =1
          ;}          
          ;{ menu Help
        Case 121
          txt$="Infos prochainement disponibles"
          MessageRequester("Infos",txt$)
        Case 122
          MessageRequester("A propos...","Tile Editor (version "+option\version$+")"+Chr(13)+"Développé par Blendman"+Chr(13)+Chr(13)+"Mai-2012"+Chr(13)+Chr(13)+"Merci à Fred & B.Vignoli pour la base")
          ;}
      EndSelect
      
    Case #PB_Event_Gadget
    
      Select EventGadget()
          
        Case #GADGET_BrushSize
          brush\Size = GetGadgetState(#GADGET_BrushSize)
          
        Case #GADGET_BrushType
          brush\type = GetGadgetState(#GADGET_BrushType)
          
        Case #GADGET_BrushTra
          brush\alpha = GetGadgetState(#GADGET_BrushTra)
          SetBrush()
          
        Case #GADGET_BrushTool
          brush\tool = GetGadgetState(#GADGET_BrushTool)
          SetBrush()
          
        Case #GADGET_BrushKeepAlpha
          brush\keepAlpha = GetGadgetState(#GADGET_BrushKeepAlpha)
          
        Case #GADGET_Canvas
          X = GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_MouseX)
          Y = GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_MouseY)
          Type = EventType()
        
          Select EventType()
          
            Case #PB_EventType_LeftButtonDown              ;
              ; This stores the current content of the CanvasGadget in #IMAGE_Content,
              ; so it can be re-drawn while the mouse moves              ;
              If StartDrawing(ImageOutput(#IMAGE_Content))
                  DrawingMode(#PB_2DDrawing_AlphaBlend) ;canvas gadget doesn't have alpha
                  DrawImage(GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Image), 0, 0)
                StopDrawing()
              EndIf

              
              StartX = X
              StartY = Y
              DrawAction(X, Y, EventType())             
              mouseDown = #True  ;handles problems of mouse being used in OpenFileRequester
            
            Case #PB_EventType_LeftButtonUp
              If mouseDown
                DrawAction(x, y, EventType())                       
                mouseDown = #False
              EndIf 
                                  
            
            Case #PB_EventType_MouseMove
              If GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
                DrawAction(X, Y, EventType())            
              EndIf
                      
          EndSelect
        
        Case #GADGET_Color
          CurrentColor = ColorRequester(CurrentColor)
          SetBrush()
          If StartDrawing(ImageOutput(#IMAGE_Color))
            Box(0, 0, 30,30, CurrentColor)
            StopDrawing()
            SetGadgetAttribute(#GADGET_Color, #PB_Button_Image, ImageID(#IMAGE_Color))
          EndIf
          
          
        Case #GADGET_Brush, #GADGET_Line, #GADGET_Box, #GADGET_Circle, #GADGET_Fill
          EventGadget = EventGadget()
          For Gadget = #GADGET_Brush To #GADGET_Fill
            If Gadget = EventGadget
              SetGadgetState(Gadget, 1) 
            Else
              SetGadgetState(Gadget, 0) ; unset the state of all other gadgets
            EndIf
          Next Gadget          
          CurrentMode = EventGadget             
      
        Case #GADGET_Clear
          ;ClearLayer()
          ClearCanvas()
          
      EndSelect 
      
    Case #PB_Event_SizeWindow,#PB_Event_MaximizeWindow
      AddCanvas()
      
  EndSelect  
  
Until event = #PB_Event_CloseWindow

;{ procedures
; canvas
Procedure AddCanvas()
  If IsGadget(#GADGET_ScrollCanvas)
    FreeGadget(#GADGET_ScrollCanvas)
  EndIf  
  If IsGadget(#GADGET_Canvas)
    FreeGadget(#GADGET_Canvas)
  EndIf 
  If WindowWidth(#win0)/2-doc\w/2 > 60 
    ww = WindowWidth(#win0)/2-doc\w/2
  Else
    ww = 60
  EndIf  
  If WindowHeight(#win0)/2-doc\h/2 > 50
    hh = WindowHeight(#win0)/2-doc\h/2 
  Else
    hh = 50
  EndIf
  ;AddImage()
  ScrollAreaGadget(#GADGET_ScrollCanvas,60,50,WindowWidth(#win0)-120,WindowHeight(#win0)-100, doc\w*4,doc\h*4)
  areaw = GetGadgetAttribute(#GADGET_ScrollCanvas,#PB_ScrollArea_InnerWidth)
  areah = GetGadgetAttribute(#GADGET_ScrollCanvas,#PB_ScrollArea_InnerHeight)
  CanvasGadget(#GADGET_Canvas,areaw/2-doc\w/2,areah/2-doc\h/2,doc\w,doc\h,#PB_Canvas_ClipMouse | #PB_Canvas_Keyboard)
  SetGadgetAttribute(#GADGET_ScrollCanvas,#PB_ScrollArea_X,areaw/2-doc\w/2-30)
  SetGadgetAttribute(#GADGET_ScrollCanvas,#PB_ScrollArea_Y,areah/2-doc\h/2-25)
  CloseGadgetList()
  UpdateScreen()
EndProcedure
Procedure UpdateScreen()
;   If NbImgImport>0 And sel>0
;     SetWindowTitle(#win0,option\name$+"   ... "+Str(sel))
;   Else
;     SetWindowTitle(#win0,option\name$)
;   EndIf
  
  tempimg=CreateImage(#PB_Any,doc\w,doc\h)
  StartDrawing(ImageOutput(tempimg))
  DrawingMode(#PB_2DDrawing_Default)
  DrawImage(ImageID(#IMAGE_Grid),0,0)
  DrawingMode(#PB_2DDrawing_AlphaBlend)
  If sel>0
    DrawAlphaImage(ImageID(im(sel)),imx(sel),imy(sel))
  EndIf
  DrawAlphaImage(ImageID(#IMAGE_LayerActif),0,0)
  StopDrawing()
  
  StartDrawing(CanvasOutput(#GADGET_Canvas))
  DrawingMode(#PB_2DDrawing_Default)
  DrawImage(ImageID(tempimg),0,0)
  StopDrawing()
  FreeImage(tempimg)  
EndProcedure
Procedure ClearLayer(img=#IMAGE_LayerActif)
  If StartDrawing(ImageOutput(img))
    DrawingMode(#PB_2DDrawing_AlphaChannel)
    Box(0,0,doc\w,doc\h,RGBA(0,0,0,0)) 
    StopDrawing()
  EndIf 
EndProcedure
Procedure ClearCanvas()
  If StartDrawing(CanvasOutput(#GADGET_Canvas))
    DrawingMode(#PB_2DDrawing_Default)
    DrawImage(ImageID(#IMAGE_Grid),0,0)
    StopDrawing()
  EndIf
EndProcedure

Procedure UpdateCanvas()
  If StartDrawing(CanvasOutput(#GADGET_Canvas))
    ;DrawingMode(#PB_2DDrawing_AlphaChannel)
    ;Box(0,0,doc\w,doc\h,RGBA(0,0,0,0))
    ;DrawingMode(#PB_2DDrawing_AlphaBlend)
    DrawAlphaImage(ImageID(#IMAGE_LayerActif),0,0)
    StopDrawing()
  EndIf
EndProcedure

; utils
Procedure CreateCheckker()
  If StartDrawing(ImageOutput(#IMAGE_Grid))    
    c=255
    For y=0 To 767 Step 16
      For x=0 To 1023 Step 16
        Box(x,y,16,16,RGBA(c,c,c,255))
        If c=255
          c=192
        Else
          c=255
        EndIf
      Next
      If c=255
        c=192
      Else
        c=255
      EndIf
    Next
    StopDrawing()
  EndIf
EndProcedure
Procedure AddImage() 
  If IsImage(#IMAGE_Content)
    FreeImage(#IMAGE_Content)
  EndIf
  If IsImage(#IMAGE_LayerActif)
    FreeImage(#IMAGE_LayerActif)
  EndIf  
  If CreateImage(#IMAGE_Content, doc\w,doc\h, 32|#PB_Image_Transparent)
  EndIf  
  If CreateImage(#IMAGE_LayerActif,doc\w,doc\h,32|#PB_Image_Transparent)
  EndIf
EndProcedure

;brush
Procedure SetBrush()
  Select brush\tool
    Case 0, 1
      CurrentColor = RGBA(Red(CurrentColor), Blue(CurrentColor),Green(CurrentColor), brush\alpha)               
    Case 2
      CurrentColor = RGB(Red(CurrentColor), Blue(CurrentColor),Green(CurrentColor))
  EndSelect
EndProcedure

; drawing
Procedure DrawAction(x, y, EventType)
  ;If StartDrawing(CanvasOutput(#GADGET_Canvas)) ; ça, ça marche, mais c'es tpas ça que je veux :)
  If StartDrawing(ImageOutput(#IMAGE_LayerActif))
    If brush\tool = 2 ; eraser
      DrawingMode(#PB_2DDrawing_AllChannels)
    Else
      If brush\keepAlpha = 0
        DrawingMode(#PB_2DDrawing_AlphaBlend)
      EndIf      
    EndIf
    
    Select CurrentMode
    
      Case #GADGET_Brush        
        If EventType = #PB_EventType_LeftButtonDown Or EventType = #PB_EventType_MouseMove
          Select brush\type
              
              Case 0 ; cercle
                Circle(x, y, brush\Size, CurrentColor)
                
              Case 1; carré
                Box(x-brush\Size/2,y-brush\Size/2,brush\Size/2,brush\Size/2,CurrentColor)
                
              Case 2
                
            EndSelect            
        EndIf
        
      Case #GADGET_Line
        DrawImage(ImageID(#IMAGE_Content), 0, 0)
        LineXY(StartX, StartY, x, y, CurrentColor)
      
      Case #GADGET_Box
        DrawImage(ImageID(#IMAGE_Content), 0, 0)
        Box(StartX, StartY, x-StartX, y-StartY, CurrentColor)
        
      Case #GADGET_Circle
        DrawImage(ImageID(#IMAGE_Content), 0, 0)        
        If x > StartX
          rx = x - StartX
        Else
          rx = StartX - x
        EndIf
        
        If y > StartY
          ry = y - StartY
        Else
          ry = StartY - y
        EndIf
        
        If GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Modifiers) & #PB_Canvas_Control
          ry = rx
        EndIf
        
        Ellipse(StartX, StartY, rx, ry, CurrentColor)
      
      Case #GADGET_Fill
        If EventType = #PB_EventType_LeftButtonDown
          FillArea(x, y, -1, CurrentColor)
        EndIf
  
    EndSelect
    StopDrawing()
  EndIf
  UpdateScreen()
EndProcedure

; window
Procedure WindowPref()
EndProcedure

; save, load
Procedure NewTileSet()
  ClearLayer()
  ClearCanvas()
  doc\w = doc\w_def
  doc\h = doc\h_def
  AddCanvas()
EndProcedure
Procedure ConvertImg()
  
EndProcedure
Procedure LoadImg()
  ; à revoir
  File$ = OpenFileRequester("Load Image...", "", "PNG Images|*.png|JPEG Images|*.jpeg|All Files|*.*", 0)
  If File$
    If LoadImage(#IMAGE_LoadSave, File$)
      If StartDrawing(ImageOutput(#IMAGE_LayerActif))
        DrawingMode(#PB_2DDrawing_AllChannels)
        DrawAlphaImage(ImageID(#IMAGE_LoadSave), 0, 0)
        StopDrawing()
      EndIf
      doc\w = ImageWidth(#IMAGE_LoadSave)
      doc\h = ImageHeight(#IMAGE_LoadSave)
      AddCanvas()
      FreeImage(#IMAGE_LoadSave)      
    Else
      MessageRequester("CanvasGadget", "Cannot load image: " + File$)
    EndIf
  EndIf
EndProcedure
Procedure SaveImg()
  File$ = SaveFileRequester("Save Image...", File$, "PNG Images|*.png|JPEG Images|*.jpeg", 0)
  If File$ And (FileSize(File$) = -1 Or MessageRequester("CanvasGadget", "Overwrite this file? " + File$, #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes)
    If CreateImage(#IMAGE_LoadSave,  doc\w, doc\h, 32|#PB_Image_Transparent) And StartDrawing(ImageOutput(#IMAGE_LoadSave))
      ;DrawImage(GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Image), 0, 0)
      DrawAlphaImage(ImageID(#IMAGE_LayerActif), 0, 0)
      StopDrawing()      
      If SelectedFilePattern() = 0 ; png 
        If SaveImage(#IMAGE_LoadSave, RemoveString(File$,".png")+".png", #PB_ImagePlugin_PNG) = 0
          MessageRequester("CanvasGadget", "Cannot save image: " + File$)
        EndIf
      ElseIf SelectedFilePattern() = 1 ; jpg
        If SaveImage(#IMAGE_LoadSave, RemoveString(File$,".jpg")+".jpg", #PB_ImagePlugin_JPEG) = 0
          MessageRequester("CanvasGadget", "Cannot save image: " + File$)
        EndIf
      ElseIf SelectedFilePattern() = 2 ; bmp
        If SaveImage(#IMAGE_LoadSave, RemoveString(File$,".bmp")+".bmp", #PB_ImagePlugin_BMP) = 0
          MessageRequester("CanvasGadget", "Cannot save image: " + File$)
        EndIf
      EndIf
    EndIf
    
    If CreateImage(#IMAGE_LoadSave,  doc\w, doc\h, 32|#PB_Image_Transparent) And StartDrawing(ImageOutput(#IMAGE_LoadSave))
      ;DrawImage(GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Image), 0, 0)
      DrawAlphaImage(ImageID(#IMAGE_Content), 0, 0)
      StopDrawing()
      
      If SelectedFilePattern() = 0 ; jpg
        If SaveImage(#IMAGE_LoadSave, RemoveString(File$,".jpg")+".jpg", #PB_ImagePlugin_JPEG) = 0
          MessageRequester("CanvasGadget", "Cannot save image: " + File$)
        EndIf
      ElseIf SelectedFilePattern() = 1 ; png
        If SaveImage(#IMAGE_LoadSave, RemoveString(File$,".png")+".png", #PB_ImagePlugin_PNG) = 0
          MessageRequester("CanvasGadget", "Cannot save image: " + File$)
        EndIf
      EndIf
    EndIf      
    FreeImage(#IMAGE_LoadSave)
  EndIf        
EndProcedure
;}
Maintenant, faut que j'ajoute le zoom, et la conversion d'une image en TileSet, ainsi qu'une grille définissable (bon, ça c'est facile) :)

Re: Tile Editor

Publié : lun. 04/juin/2012 11:55
par Demivec
petit bug quand on change la couleur
Peut-être . . .

Code : Tout sélectionner

;CurrentColor = RGBA(Red(CurrentColor), Blue(CurrentColor),Green(CurrentColor), brush\alpha) 
CurrentColor = RGBA(Red(CurrentColor), Green(CurrentColor),Blue(CurrentColor), brush\alpha)             

;CurrentColor = RGB(Red(CurrentColor), Blue(CurrentColor),Green(CurrentColor))
CurrentColor = RGB(Red(CurrentColor), Green(CurrentColor),Blue(CurrentColor))

Aussi, 'Fill' ne fonctionne pas correctement maintenant.

Re: Tile Editor

Publié : lun. 04/juin/2012 13:21
par blendman
salut

Merci, j'ai fait un update du 1er code, et j'ai créé un nouveau message :
http://www.purebasic.fr/french/viewtopi ... =3&t=12861

Re: Tile Editor

Publié : mar. 05/juin/2012 19:59
par blendman
salut

J'ai réalisé un petit code que j'ai intégré à mon tile editor afin de convertir une image en tile.

En gros, l'idée est la suivante :
- j'ouvre une image
- je la découpe en petite image de 32*32 par exemple
- puis, je sauvegarde une autre image, dans laquelle je place toutes ces petites images à la suite, sauf que cette nouvelle n'est pas forcément de la même taille que la première et sa largeur est multiple de la taille de découpe (*32)

Et je suis parvenu à un certain résultat, mais j'obtiens des cases vides, sauriez-vous où je me suis planté ?

Merci :)

Code : Tout sélectionner

#IMAGE_LoadSave = 0
#IMAGE_Convert = 1 
#winConvertTileset =0
Enumeration 
    #GADGET_WTileFr1
  #GADGET_WTileFr2
  #GADGET_WTileTxt
  #GADGET_WTileTxt2
  #GADGET_WTileTxt3
  #GADGET_WTileW
  #GADGET_WTileH
  #GADGET_WTileWmax
  #GADGET_WTileHmax
  #GADGET_WTileConstraint
  #GADGET_WTilebtnOk
  #GADGET_WTilebtnCancel
  #GADGET_WTileNewImg
  #GADGET_WTilePos
EndEnumeration

UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()

File$ = OpenFileRequester("Load Image...", "", "PNG Images|*.png|JPEG Images|*.jpeg|All Files|*.*", 0)
If File$
  If LoadImage(#IMAGE_LoadSave, File$)      
    If OpenWindow(#winConvertTileset,0,0,400,300,"Convert to TileSet",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget)
      dee.a= 110
      dh.a=10
      ; variables
      Define tileH.w=32,tileW.w=32,tileWmax.a = 10  
      imgW = ImageWidth(#IMAGE_LoadSave)
      imgH = ImageHeight(#IMAGE_LoadSave)
      ;{ gadgets
      If Frame3DGadget(#GADGET_WTileFr1,10,10,dee + 60,120,"Export Dimension")          
        txt1$="Width :"
        txt2$="Height :"
        TextGadget(#GADGET_WTileTxt,dee-Len(txt1$)*5,dh+22,120,20,txt1$)
        TextGadget(#GADGET_WTileTxt2,dee-Len(txt2$)*5,dh+52,120,20,txt2$)
        
        SpinGadget(#GADGET_WTileW,dee,dh+20,50,20,1,256,#PB_Spin_Numeric)
        SpinGadget(#GADGET_WTileH,dee,dh+50,50,20,1,256,#PB_Spin_Numeric)
        
        SetGadgetState(#GADGET_WTileW,tileW)
        SetGadgetState(#GADGET_WTileH,tileH)
        SpinGadget(#GADGET_WTileWmax,dee+20,dh+80,30,20,1,50,#PB_Spin_Numeric)
        SetGadgetState(#GADGET_WTileWmax,tileWmax)
        txt3$="Export Width : "+Str(GetGadgetState(#GADGET_WTileWmax)* Val(GetGadgetText(#GADGET_WTileW)))
        TextGadget(#GADGET_WTileTxt3,dee-Len(txt3$)*5,dh+82,100,20,txt3$)
        
      EndIf
      If Frame3DGadget(#GADGET_WTileFr2,10,140,dee+60,120,"Options")
        CheckBoxGadget(#GADGET_WTileConstraint,20,160,130,20,"Constraint Proportion")
        proportion = 1
        SetGadgetState(#GADGET_WTileConstraint,proportion)                    
        CheckBoxGadget(#GADGET_WTileNewImg,20,180,130,20,"Create a New image")
        NewImg = 1
        SetGadgetState(#GADGET_WTileNewImg,NewImg)   
        ComboBoxGadget(#GADGET_WTilePos,20,200,130,20)
        AddGadgetItem(#GADGET_WTilePos,0,"Begining of the image")
        AddGadgetItem(#GADGET_WTilePos,1,"End of the image")
        
        ;ScrollAreaGadget(#GADGET_wTileScroll,
      EndIf
      ButtonGadget(#GADGET_WTilebtnOk,dee+30,270,60,20,"OK")
      ButtonGadget(#GADGET_WTilebtnCancel,dee+100,270,60,20,"Cancel")
      ;}
    EndIf
    
    Repeat      
      event = WaitWindowEvent(10)      
      Select event
          
        Case #PB_Event_Gadget
          
          Select EventGadget()
              ;{ autres gadgets
            Case #GADGET_WTileConstraint                
              proportion = GetGadgetState(#GADGET_WTileConstraint)
              
            Case #GADGET_WTileNewImg
              NewImg = GetGadgetState(#GADGET_WTileNewImg)
              
            Case #GADGET_WTileW, #GADGET_WTileWmax, #GADGET_WTileH
              If proportion = 1
                If EventGadget() = #GADGET_WTileW                  
                  SetGadgetState(#GADGET_WTileH,GetGadgetState(#GADGET_WTileW))                                  
                ElseIf EventGadget() = #GADGET_WTileH
                  SetGadgetState(#GADGET_WTileW,GetGadgetState(#GADGET_WTileH))    
                EndIf
              EndIf
              tileH=GetGadgetState(#GADGET_WTileH)
              tileW=GetGadgetState(#GADGET_WTileW)
              tileWmax = GetGadgetState(#GADGET_WTileWmax)
              txt3$="Export Width : "+Str(tileWmax* tileH)
              SetGadgetText(#GADGET_WTileTxt3,txt3$)
              ;}
              
            Case #GADGET_WTilebtnOk 
              
              totalpixel = imgW * imgH                
              newImgH = Round(totalpixel/(tileWmax * tileW),1) +tileH               
              
              NbrImgNew = (Round(imgW/tileW,1)+3) * (Round(imgH/TileH,1)+3)             
              Dim imgdecoup(NbrImgNew)
              
              a=0
              For j = 0 To Round(imgH/tileH,1)+1
                For i = 0 To Round(imgW/tileW,1)+1
                  imgdecoup(a) = GrabImage(#IMAGE_LoadSave, #PB_Any, i*tileW, j*tileH, tileW, tileH) 
                  a+1                    
                Next i             
              Next  j
              
              If NewImg                  
                a=0                
                CreateImage(#IMAGE_Convert,tileWmax*tileW,newImgH,32|#PB_Image_Transparent)
                StartDrawing(ImageOutput(#IMAGE_Convert))                  
                For j = 0 To Round(newImgH/tileH,1) +2
                  For i = 0 To tileWmax                                       
                    DrawAlphaImage(ImageID(imgdecoup(a)),i*tileW,j* tileH)
                    a+1                    
                  Next i  
                Next  j                  
                StopDrawing()
                File$ = SaveFileRequester("Save Image...", File$, "PNG Images|*.png|JPEG Images|*.jpeg|BMP Images|*.bmp", 0)
                If File$ And (FileSize(File$) = -1 Or MessageRequester("Save an image", "Overwrite this file? " + File$, #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes)
                  If SelectedFilePattern() = 0 ; png 
                    If SaveImage(#IMAGE_Convert, RemoveString(File$,".png")+".png", #PB_ImagePlugin_PNG) = 0
                      MessageRequester("Save Image", "Cannot save image: " + File$)
                    EndIf
                  ElseIf SelectedFilePattern() = 1 ; jpg
                    If SaveImage(#IMAGE_Convert, RemoveString(File$,".jpg")+".jpg", #PB_ImagePlugin_JPEG) = 0
                      MessageRequester("Save Image", "Cannot save image: " + File$)
                    EndIf
                  ElseIf SelectedFilePattern() = 2 ; bmp
                    If SaveImage(#IMAGE_Convert, RemoveString(File$,".bmp")+".bmp", #PB_ImagePlugin_BMP) = 0
                      MessageRequester("Save Image", "Cannot save image: " + File$)
                    EndIf
                  EndIf
                  FreeImage(#IMAGE_Convert)
                  FreeImage(#IMAGE_LoadSave)
                  FreeArray(imgdecoup())
                  quit = 1
                EndIf     
              Else
                MessageRequester("","Sorry, not coed for the moment, choose 'new image' as option")
              EndIf
              
            Case #GADGET_WTilebtnCancel
              quit = 1
              
          EndSelect
                    
        Case #PB_Event_CloseWindow
          If GetActiveWindow() = #winConvertTileset
            quit = 1
          EndIf
      EndSelect
            
    Until quit = 1
    CloseWindow(#winConvertTileset)   
  EndIf
EndIf

Re: Tile Editor

Publié : mar. 05/juin/2012 21:11
par Cool Dji
Hello Blendman,

tu as vérifié que la découpe se faisait bien ?
Affiche ou enregistre toutes les découpes pour voir...

Re: Tile Editor

Publié : mar. 05/juin/2012 21:26
par case
en fait il ajoutait des tiles en plus dans ses calculs

une largeur par ci, une tile de plus par ligne et par colonne ça vas vite :)

j'ai mis des marqueurs <+++++++++++++++++++++ là ou j'ai modifié ton code.

Code : Tout sélectionner

#IMAGE_LoadSave = 0
#IMAGE_Convert = 1
#winConvertTileset =0
Enumeration
    #GADGET_WTileFr1
  #GADGET_WTileFr2
  #GADGET_WTileTxt
  #GADGET_WTileTxt2
  #GADGET_WTileTxt3
  #GADGET_WTileW
  #GADGET_WTileH
  #GADGET_WTileWmax
  #GADGET_WTileHmax
  #GADGET_WTileConstraint
  #GADGET_WTilebtnOk
  #GADGET_WTilebtnCancel
  #GADGET_WTileNewImg
  #GADGET_WTilePos
EndEnumeration

UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()

File$ = OpenFileRequester("Load Image...", "", "PNG Images|*.png|JPEG Images|*.jpeg|All Files|*.*", 0)
If File$
  If LoadImage(#IMAGE_LoadSave, File$)     
    If OpenWindow(#winConvertTileset,0,0,400,300,"Convert to TileSet",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget)
      dee.a= 110
      dh.a=10
      ; variables
      Define tileH.w=32,tileW.w=32,tileWmax.a = 10
      imgW = ImageWidth(#IMAGE_LoadSave)
      imgH = ImageHeight(#IMAGE_LoadSave)
      ;{ gadgets
      If Frame3DGadget(#GADGET_WTileFr1,10,10,dee + 60,120,"Export Dimension")         
        txt1$="Width :"
        txt2$="Height :"
        TextGadget(#GADGET_WTileTxt,dee-Len(txt1$)*5,dh+22,120,20,txt1$)
        TextGadget(#GADGET_WTileTxt2,dee-Len(txt2$)*5,dh+52,120,20,txt2$)
       
        SpinGadget(#GADGET_WTileW,dee,dh+20,50,20,1,256,#PB_Spin_Numeric)
        SpinGadget(#GADGET_WTileH,dee,dh+50,50,20,1,256,#PB_Spin_Numeric)
       
        SetGadgetState(#GADGET_WTileW,tileW)
        SetGadgetState(#GADGET_WTileH,tileH)
        SpinGadget(#GADGET_WTileWmax,dee+20,dh+80,30,20,1,50,#PB_Spin_Numeric)
        SetGadgetState(#GADGET_WTileWmax,tileWmax)
        txt3$="Export Width : "+Str(GetGadgetState(#GADGET_WTileWmax)* Val(GetGadgetText(#GADGET_WTileW)))
        TextGadget(#GADGET_WTileTxt3,dee-Len(txt3$)*5,dh+82,100,20,txt3$)
       
      EndIf
      If Frame3DGadget(#GADGET_WTileFr2,10,140,dee+60,120,"Options")
        CheckBoxGadget(#GADGET_WTileConstraint,20,160,130,20,"Constraint Proportion")
        proportion = 1
        SetGadgetState(#GADGET_WTileConstraint,proportion)                   
        CheckBoxGadget(#GADGET_WTileNewImg,20,180,130,20,"Create a New image")
        NewImg = 1
        SetGadgetState(#GADGET_WTileNewImg,NewImg)   
        ComboBoxGadget(#GADGET_WTilePos,20,200,130,20)
        AddGadgetItem(#GADGET_WTilePos,0,"Begining of the image")
        AddGadgetItem(#GADGET_WTilePos,1,"End of the image")
       
        ;ScrollAreaGadget(#GADGET_wTileScroll,
      EndIf
      ButtonGadget(#GADGET_WTilebtnOk,dee+30,270,60,20,"OK")
      ButtonGadget(#GADGET_WTilebtnCancel,dee+100,270,60,20,"Cancel")
      ;}
    EndIf
   
    Repeat     
      event = WaitWindowEvent(10)     
      Select event
         
        Case #PB_Event_Gadget
         
          Select EventGadget()
              ;{ autres gadgets
            Case #GADGET_WTileConstraint               
              proportion = GetGadgetState(#GADGET_WTileConstraint)
             
            Case #GADGET_WTileNewImg
              NewImg = GetGadgetState(#GADGET_WTileNewImg)
             
            Case #GADGET_WTileW, #GADGET_WTileWmax, #GADGET_WTileH
              If proportion = 1
                If EventGadget() = #GADGET_WTileW                 
                  SetGadgetState(#GADGET_WTileH,GetGadgetState(#GADGET_WTileW))                                 
                ElseIf EventGadget() = #GADGET_WTileH
                  SetGadgetState(#GADGET_WTileW,GetGadgetState(#GADGET_WTileH))   
                EndIf
              EndIf
              tileH=GetGadgetState(#GADGET_WTileH)
              tileW=GetGadgetState(#GADGET_WTileW)
              tileWmax = GetGadgetState(#GADGET_WTileWmax)
              txt3$="Export Width : "+Str(tileWmax* tileH)
              SetGadgetText(#GADGET_WTileTxt3,txt3$)
              ;}
             
            Case #GADGET_WTilebtnOk
             
              totalpixel = imgW * imgH               
              newImgH = Round(totalpixel/(tileWmax * tileW),1); +tileH ;- <+++++++++++++++++++++++++++++++++++              
              NbrImgNew = (Round(imgW/tileW,1)+1) * (Round(imgH/TileH,1)+1)   ;- <+++++++++++++++++++++++++++++++++++       
              Dim imgdecoup(NbrImgNew)
             
              a=0
              For j = 0 To imgH/tileH-1  ;- <+++++++++++++++++++++++++++++++++++          
                For i = 0 To imgW/tileW-1 ;- <+++++++++++++++++++++++++++++++++++
                  imgdecoup(a) = GrabImage(#IMAGE_LoadSave, #PB_Any, i*tileW, j*tileH, tileW, tileH)
                  a+1                   
                Next i             
              Next  j
              If NewImg                 
                a=0               
                CreateImage(#IMAGE_Convert,tileWmax*tileW,newImgH,32|#PB_Image_Transparent)
                StartDrawing(ImageOutput(#IMAGE_Convert))                 
                For j = 0 To Round(newImgH/tileH,1)
                  For i = 0 To tileWmax-1   ;- <+++++++++++++++++++++++++++++++++++                                      
                    DrawAlphaImage(ImageID(imgdecoup(a)),i*tileW,j* tileH)
                    a+1                   
                  Next i 
                Next  j                 
                StopDrawing()
                File$ = SaveFileRequester("Save Image...", File$, "PNG Images|*.png|JPEG Images|*.jpeg|BMP Images|*.bmp", 0)
                If File$ And (FileSize(File$) = -1 Or MessageRequester("Save an image", "Overwrite this file? " + File$, #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes)
                  If SelectedFilePattern() = 0 ; png
                    If SaveImage(#IMAGE_Convert, RemoveString(File$,".png")+".png", #PB_ImagePlugin_PNG) = 0
                      MessageRequester("Save Image", "Cannot save image: " + File$)
                    EndIf
                  ElseIf SelectedFilePattern() = 1 ; jpg
                    If SaveImage(#IMAGE_Convert, RemoveString(File$,".jpg")+".jpg", #PB_ImagePlugin_JPEG) = 0
                      MessageRequester("Save Image", "Cannot save image: " + File$)
                    EndIf
                  ElseIf SelectedFilePattern() = 2 ; bmp
                    If SaveImage(#IMAGE_Convert, RemoveString(File$,".bmp")+".bmp", #PB_ImagePlugin_BMP) = 0
                      MessageRequester("Save Image", "Cannot save image: " + File$)
                    EndIf
                  EndIf
                  FreeImage(#IMAGE_Convert)
                  FreeImage(#IMAGE_LoadSave)
                  FreeArray(imgdecoup())
                  quit = 1
                EndIf     
              Else
                MessageRequester("","Sorry, not coed for the moment, choose 'new image' as option")
              EndIf
             
            Case #GADGET_WTilebtnCancel
              quit = 1
             
          EndSelect
                   
        Case #PB_Event_CloseWindow
          If GetActiveWindow() = #winConvertTileset
            quit = 1
          EndIf
      EndSelect
           
    Until quit = 1
    CloseWindow(#winConvertTileset)   
  EndIf
EndIf

Re: Tile Editor

Publié : mar. 05/juin/2012 21:34
par Cool Dji
Rhoooooooooo Blendman :D

Re: Tile Editor

Publié : mer. 06/juin/2012 7:01
par kelebrindae
Bravo! La rapidité avec laquelle tu codes de nouvelles applis est impressionnante, décidément...

Pour revenir à ton besoin initial: as-tu essayé Tile Studio? http://tilestudio.sourceforge.net/
C'est un outil gratuit, qui permet de créer des cartes à partir de tiles (animées ou non), avec plusieurs layers. Il peut extraire des tuiles d'une images, et générer les pages de tiles à partir de la carte que tu sauvegardes. Et il y a même des fonctionnalités de dessin/retouches.
En plus, le format de sauvegarde des cartes est entièrement paramétrable: tu peux y inclure les infos que tu veux, sous la forme que tu veux, dans l'ordre que tu veux, etc.. C'est extrêmement souple!

J'avais un peu bidouillé avec, en mon temps, et même si le code PB ne fonctionne plus qu'avec le subsystem "DirectX7", ça peut peut-être te donner des idées de la façon dont on peut paramétrer/utiliser cet outil:
http://www.purebasic.fr/french/viewtopi ... ile+studio
http://www.purebasic.fr/french/viewtopi ... TileStudio

Re: Tile Editor

Publié : mer. 06/juin/2012 11:11
par blendman
Case : un grand merci !
J'avais ajouté quelques trucs par-ci par là pour tenter de corriger sans trop réfléchir à vrai dire ^^'.

Cool Dji : roooohhh :D

Kelebrindae : en fait, je connais bien TileStudio, mais le problème c'est qu'il ne gère pas la couche alpha des png :(, alors, j'ai du me résoudre à refaire ce genre d'outil moi-même (du moins pour l'import d'import et la transformation en TileSet).
Je l'aurai volontiers utilisé s'il avait géré la transparence correctement, mais hélas, il est resté au modèle du gif avec une transparence gérée par couleur d'un pixel et non un canal alpha ;).

Mon but n'est pas de concevoir un TileStudio Bis (quoique, on verra si j'ai le temps ou si j'ai un peu d'aide :)), mais de proposer un outil qui permette :
- de convertir une image en tileset, dont on définit la taille des cases (même non proportionnelles) et la largeur maximal (j'ajouterai peut être la hauteur) : ça, c'est ok grâce à Case :D
- d'ajouter une image "tileSetisée" à un autre tileset (en début ou en fin d'image) : pas encore fait, mais bon, ça ne devrait pas être compliqué.
- éventuellement de modifier un peu (retoucher) cette image : c'est commencé, mais ça but sérieux avec le zoom ^^.
- de créer un spritesheet à partir de plusieurs images
- de pouvoir retoucher ce sprite (par exemple on modifiant le centre global du spritesheet) : ça devrait être faisable en utilisant le code de B.Vignoli trouvé sur ce forum.
- j'ajouterai sans doute quelques bricoles que j'ai déjà en stock (modification d'une image (couleur, teinte, saturation..).
- et peut être que plus tard, j'ajouterai un mode "map editor", on verra mais ce sera pas pour tout de suite ^^.

Du coup, voici un update de mon TEO (Tile Editor Organisation) :
(source+ exe)
http://www.purebasic.fr/french/viewtopi ... =3&t=12861

Re: Tile Editor

Publié : jeu. 14/juin/2012 9:54
par jbernard13
Grand merci pour ton code blendman , j'adore

Re: Tile Editor

Publié : jeu. 14/juin/2012 10:13
par case
pour le zoom tu peux faire un grabimage() et afficher l'image en augmentant la taille x2 x4 etc...