TEO (Tile Editor Organisation)

Programmation d'applications complexes
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

TEO (Tile Editor Organisation)

Message par blendman »

J'ai commencé l'élaboration d'un petit tile/sprite editor car je n'ai pas trouvé l'outil que je cherchais.

Nom de code : TEO
Pour Tile Editor Organisation

FONCTIONS

Cet éditeur permet notamment de concevoir :

1) Des sprites
- pour jeu vidéo : avec palette ou non, animé ou non...

2) des TileSet (à partir d'un tileset pré-existant ou non)

3) des SpriteSheet ou des animations
- A partir d'une série d'image ou d'un sprite sheet existant.
- en créant les images nous-même ou en les important.

4) des images quelconques (painting)

- de créer des spritesheet : par exemple, la suite d'images d'animation de personnage
- de créer des tileset : depuis une image, on devrait pouvoir sortir un tileset et ajouter des tile dessus, mixer des tileset entre eux, etc..
- modifier le centre des images d'une animation et peut être pouvoir les retoucher
- accessoirement en bonus, on pourra retoucher et modifier un peu les images (dessin basique, gomme.. ), mais ce n'est pas tellement le but à la base.


Détails des fonctions

Version 0.2807
- outil texte : on peut ajouter un calque de texte, changer le texte, la couleur de la police, la police, son style, etc..
- l'affichage des calques est modifié : ce n'est plus une liste mais un scrollarea avec des imagegadgets pour chaque layer. ON voit donc désormais des icones sur le calque, ainsi qu'une miniature de l'image du calque correspondant.
- UI : j'ai ajouté dans les options des outils le scatter et l'espace entre les points.
- ajout de raccourcis : X/C pour changer les brosses, 1 : réduit la taille de la brosse, 2 : augmente la taille.
- en cliquant sur la couleur Foreground, on ouvre un colorrequester() pour changer cette couleur.
- avec l'outil "bouger le calque", les flèches permettent de le bouger au pixel près
- Menu transformation : contraste/luminosité (merci Dobro et LSI)
- Menu Affichage : on peut afficher ou non les toolbar (fichier et outils) ainsi que la barre d'état.
- Désormais, la position des toolbar est sauvegardé à la fermeture et replacée à l'ouverture du logiciel.

Version 0.2622
- outil tampon : permet de dessiner avec un motif (pattern). ON choisit le motif dans l'onglet "pattern" (du côté des onglets couleurs/swatch...)
- Brush : optimisation du trait, ajout de la rotation
- ajout de type d'outil : blur, pixel, glass, noise
- ajout d'un filtre : noise
- transformation : désaturation, inversion de couleur, balance des couleurs (bugué)
- outil sélection fonctionne, on peut dessiner sur la sélection, etc..
- début de la fenêtre de préférence
- corrections de plusieurs bugs (voir message précédent)
- calque : fusionner les calques invisibles, fusionner tous les calques


Version 0.228

Fonctions principales :
⦁ Fichier : new, open (image, .teo avec calques), save (image calques écrasé, teo (avec tous les calques)
⦁ Affichage : grid, zoom
⦁ Editions : cut/copy/paste, clear,
⦁ Calques : add, delete, merge all, position, voir le calque, lock (alpha, peinture, move), blendmode, opacité, nom
⦁ Transform : changer taille de l'image, de la surface de travail, ajuster le calque à la taille de l'image
⦁ Aide : à propos
⦁ Outils : pinceaux, spray, gomme, sélection, forme (boite, cercle, ligne, libre), dégradé, pot de peinture, color picker, zoom, bouger le canvas
⦁ Options des outils : taille, alpha (BG et FG), pas (espace entre 2 points), scatter (diffusion), couleur Bg et FG, forme de la brosse, type d'outil
⦁ Interface : changer le fond (papier), on peut déplacer les toolbar


Bugs à corriger
1. Outil zoom bug avec control (pour un zoom -)
2. les blendmode ne sont pas updatés en temps réel, il faut changer de blendmode pour voir le changement
3. Bug avec sélection : desaturation, color balance
4. bug outil hand : canvas décalé par rapport à la souris
5. Bug avec un calque Text et les blendmode : le texte n'apparait que pour le normal


Outils/fonctions pas encore fonctionnels
1. Particules
2. Forme libre
3. Changer la taille de la sélection
4. Menu Aide : Aide


Choses à revoir
1. Menu> transformation : changer la couleur de l'image à revoir
2. Tooltip des outils que en fr


Screenshots
Nouvelle version revue entièrement (09 - 10/2013) :

Image

http://www.dracaena-studio.com/tools/te ... 0.2622.jpg

http://www.dracaena-studio.com/tools/teo/Teo_v0.228.jpg

Ancienne version
Version 0.2215 :
http://blendman.free.fr/dev/pb/teo/teo_ ... 0.2215.jpg

Version 0.1670 :
http://dracaena-studio.com/tools/teo/te ... n0.167.jpg

DOWNLOAD

Nouvelle version

Version 0.2623 (19/10/2013)
http://host-a.net/u/blendman/Teo.zip

Ancienne version
Version 0.2215 (20/06/2012):
http://blendman.free.fr/dev/pb/teo/TEO.zip


CODE

Le code de la version 0.11 (je le laisse au cas où).
Le code complet est contenu dans le Zip.

Code : Tout sélectionner

;{ infos
; basé sur un code de Fred/Fantaisie Software et de B.Vignoli
; Remerciements : Demivec
; icone by marco martin
; dev : blendman 04/06/2012/
; modif
; version pb : 4.61
;}

;{ enum

#statubar =0
#menu=1
#maximages=1000

Enumeration ; window
  #WinMain
  #WinPref
  #WinResize
  #winNewTileset
EndEnumeration

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 
  ; window main
  #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
  ; window preference
  #GADGET_PrefPanel
  #GADGET_GridW
  #GADGET_GridH
  #GADGET_GridColor
  ; window resize
  #GADGET_WResW
  #GADGET_WResH
  #GADGET_WResbtn
  #GADGET_WResbtn2
  #GADGET_WResSiz
  #GADGET_WResLink
  ; window newtileset
  #GADGET_WNewTile
  #GADGET_WNewBtnOk
  #GADGET_WNewW
  #GADGET_WNewH
EndEnumeration

;}

;{ declare
Declare updateScreen() : Declare DrawAction(x, y, EventType) : Declare CreateCheckker()
Declare AddCanvas() : Declare ClearCanvas()  : Declare ResizeCanvas(mode=0)
Declare AddImage() : Declare ClearLayer(img=#IMAGE_LayerActif)
Declare OpenImg() : Declare SaveImg() : Declare ConvertImg() : Declare NewTileSet() : Declare ImportImg()
Declare WindowPref() :
Declare SetBrush() :
Declare WindowDocResize() : Declare ResizeDoc()
;}

;{ structures
Structure option ; the option of the program, document..
  name$ : version$ : grid.a
  gridW.w : gridH.w : gridColor.l
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.11"
  \grid = 1
  \gridW = 32
  \gridH = 32
  \gridColor = 0
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(#WinMain,0,0,1024,768,option\name$,flag)=0
  MessageRequester("Erreur","Impossible d'initialiser la fenêtre !")
  End
EndIf
;SmartWindowRefresh(#WinMain, #True)
;{ create menu
If CreateImageMenu(#menu,WindowID(#WinMain),#PB_Menu_ModernLook)
  MenuTitle("Fichier")
  MenuItem(9, "New Tileset")  
  MenuItem(0, "Open an Image (Tileset...)")
  MenuItem(8, "Ouvrir une image et la convertir en TileSet")
  MenuBar()
  MenuItem(10, "New Animation (sprite sheet)")
  MenuItem(1, "Importer des image(s) (animation)")
  MenuBar()
  ;MenuItem(11, "Open an image")
  MenuItem(6, "Importer une image sur le document")
  MenuBar()
  MenuItem(7, "Sauvegarder le document")
  MenuItem(5, "Exporter le tileSet")
  ;MenuItem(2, "Exporter sequence d'images")
  ;MenuItem(3, "Exporter animation en Animstrip")
  
  MenuBar()
  MenuItem(4, "Quitter")
  
  MenuTitle("Edition");21-40  
  MenuItem(32,"Redimensionner l'image")
  MenuBar()
  MenuItem(31, "Préférences")
  
  MenuTitle("View") ; 61 -90 
  MenuItem(70, "Grille"+Chr(9)+"Ctrl+G")
  MenuBar()
  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,"Ellipse")
AddGadgetItem(#GADGET_BrushType,3,"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)
;}
;}
;{ statusbar
If CreateStatusBar(#statubar,WindowID(#WinMain))
  AddStatusBarField(100)
  AddStatusBarField(200)
  AddStatusBarField(100)
EndIf
;}
;{ set gadget, menu..
SetMenuItemState(#menu,70,option\grid)
updateScreen()
SetActiveGadget(#GADGET_Canvas)
StatusBarText(#statubar,1,"Doc : "+Str(doc\w)+"/"+Str(doc\h))
;}
;}

;{ loop
Repeat  
  event=WaitWindowEvent(5) 
  win = EventWindow()
  
  Select event
      
    Case #PB_Event_Menu
      
      Select EventMenu()
          ;{ files
          ;{ open an image/tileset/spritesheet
        Case 0
          OpenImg()
          ;}          
          ;{ 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;}
          ;{ import img on doc
        Case 6 ; open img
          ImportImg()
          ;}
          ;{ save the document as img (png, jpg..)
        Case 7 ; save img
          SaveImg()
          ;}
          ;{ convertion image tileset
        Case 8
          ConvertImg()
          ;}
          ;{ new tileset
        Case 9
          NewTileSet()
          ;}
          ;{ new AnimSprite
        Case 10
          
          ;}
          ;{ quitter
        Case 4
          Break
          ;}
          ;}
          ;{ Edition
        Case 32
          WindowDocResize()
          
        Case 31
          WindowPref()
          ;}          
          ;{ view
        Case 70
          option\grid = 1-option\grid
          SetMenuItemState(#menu,70,option\grid)
          UpdateScreen()
          
          
        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"+Chr(13)+Chr(13)+"Icone by Marco Martin")
          ;}
      EndSelect
      
    Case #PB_Event_Gadget
      
      Select win
          
        Case #winNewTileset
          
          Select EventGadget()
              
            Case #GADGET_WNewW
              newW = Val(GetGadgetText(#GADGET_WNewW))
              
            Case #GADGET_WNewH             
              newH = Val(GetGadgetText(#GADGET_WNewH))
              
            Case #GADGET_WNewBtnOk
              newW = Val(GetGadgetText(#GADGET_WNewW))
              newH = Val(GetGadgetText(#GADGET_WNewH))
              If newW <>0 And newH <>0
                CloseWindow(#winNewTileset)
                SetActiveWindow(#WinMain)
                StatusBarText(#statubar,1,"Doc : "+Str(doc\w)+"/"+Str(doc\h))
                AddImage()
                ClearCanvas()
                doc\w = newW
                doc\h = newH
                ResizeDoc()
                ResizeCanvas(1)
                UpdateScreen()
              Else
                MessageRequester("Error", "The width and Height should be > 0")
              EndIf
              
          EndSelect
          
        Case #WinResize
          
          Select EventGadget()
              
            Case #GADGET_WResW
              temp_w = Val(GetGadgetText(#GADGET_WResW))
              
            Case #GADGET_WResH
              temp_h = Val(GetGadgetText(#GADGET_WResH))
              
            Case #GADGET_WResbtn ; ok
              CloseWindow(#WinResize)
              SetActiveGadget(#WinMain) 
              If temp_h > 0
                doc\h = temp_h
              EndIf
              If temp_w > 0
                doc\w = temp_w  
              EndIf
              StatusBarText(#statubar,1,"Doc : "+Str(doc\w)+"/"+Str(doc\h))
              ResizeDoc()
              ResizeCanvas()
              UpdateScreen()
              
            Case #GADGET_WResbtn2 ; cancel
              CloseWindow(#WinResize)
              
          EndSelect
          
        Case #WinPref
          
          Select EventGadget()
              
            Case #GADGET_GridW              
              option\gridW = GetGadgetState(#GADGET_GridW)
              UpdateScreen()
              
            Case #GADGET_GridH
              option\gridH = GetGadgetState(#GADGET_GridH)
              UpdateScreen()
              
            Case #GADGET_GridColor
              option\gridColor = ColorRequester(option\gridColor)
              UpdateScreen()
              
          EndSelect          
          
        Case #WinMain
          
          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) 
                    DrawingMode(#PB_2DDrawing_AlphaBlend)
                    If sel>0
                      DrawAlphaImage(ImageID(im(sel)),imx(sel),imy(sel))
                    EndIf
                    DrawAlphaImage(ImageID(#IMAGE_LayerActif),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
              AddImage()
              ClearCanvas()
              UpdateScreen()
              
          EndSelect 
          
      EndSelect
      
    Case #PB_Event_SizeWindow,#PB_Event_MaximizeWindow
      ResizeCanvas()
    Case   #PB_Event_CloseWindow
      If GetActiveWindow() = #WinMain
        quit = 1
      Else
        CloseWindow(GetActiveWindow())
        SetActiveWindow(#WinMain)
        UpdateScreen()
      EndIf      
      
  EndSelect  
  
Until quit = 1
;}

;{ procedures

; canvas
Procedure AddCanvas()
  If EventWindow() = #WinMain
    If WindowWidth(#WinMain)/2-doc\w/2 > 60 
      ww = WindowWidth(#WinMain)/2-doc\w/2
    Else
      ww = 60
    EndIf  
    If WindowHeight(#WinMain)/2-doc\h/2 > 50
      hh = WindowHeight(#WinMain)/2-doc\h/2 
    Else
      hh = 50
    EndIf
    If ScrollAreaGadget(#GADGET_ScrollCanvas,60,50,WindowWidth(#WinMain)-120,WindowHeight(#WinMain)-100, doc\w*4,doc\h*4,#PB_ScrollArea_Center)
      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()
    EndIf
    UpdateScreen()
  EndIf
EndProcedure
Procedure ResizeCanvas(mode=0)
  If GetActiveGadget() = #WinMain Or mode= 1
    If WindowWidth(#WinMain)/2-doc\w/2 > 60 
      ww = WindowWidth(#WinMain)/2-doc\w/2
    Else
      ww = 60
    EndIf  
    If WindowHeight(#WinMain)/2-doc\h/2 > 50
      hh = WindowHeight(#WinMain)/2-doc\h/2 
    Else
      hh = 50
    EndIf
    ResizeGadget(#GADGET_ScrollCanvas,60,50,WindowWidth(#WinMain)-120,WindowHeight(#WinMain)-100)
    SetGadgetAttribute(#GADGET_ScrollCanvas,#PB_ScrollArea_InnerWidth,doc\w*4)
    SetGadgetAttribute(#GADGET_ScrollCanvas,#PB_ScrollArea_InnerHeight,doc\h*4)
    areaw = GetGadgetAttribute(#GADGET_ScrollCanvas,#PB_ScrollArea_InnerWidth)
    areah = GetGadgetAttribute(#GADGET_ScrollCanvas,#PB_ScrollArea_InnerHeight)   
    
    ResizeGadget(#GADGET_Canvas,areaw/2-doc\w/2,areah/2-doc\h/2,doc\w,doc\h)
    SetGadgetAttribute(#GADGET_ScrollCanvas,#PB_ScrollArea_X,areaw/2-doc\w/2-30)
    SetGadgetAttribute(#GADGET_ScrollCanvas,#PB_ScrollArea_Y,areah/2-doc\h/2-25)
  EndIf  
EndProcedure
Procedure UpdateScreen()
  ;   If NbImgImport>0 And sel>0
  ;     SetWindowTitle(#WinMain,option\name$+"   ... "+Str(sel))
  ;   Else
  ;     SetWindowTitle(#WinMain,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)
  ; grid
  DrawingMode(#PB_2DDrawing_AllChannels)
  
  If option\grid
    For i = 0 To Round(doc\w/option\gridW,1)+1 
      For j = 0 To Round(doc\h/option\gridH,1)+1
        Line(i * option\gridW ,0,1,doc\h,option\gridColor)
        Line(0 ,j * option\gridH,doc\w,1,option\gridColor)
      Next j
    Next i  
  EndIf
  
  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

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

; image
Procedure ResizeDoc()
  ResizeImage(#IMAGE_Content,doc\w,doc\h,#PB_Image_Smooth)
  ResizeImage(#IMAGE_LayerActif,doc\w,doc\h,#PB_Image_Smooth)
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

; drawing & editing
Procedure DrawAction(x, y, EventType)
  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,brush\Size,CurrentColor)
              
            Case 2 ; ellipse
              Ellipse(X, Y, brush\Size, brush\Size/2, CurrentColor)
              
            Case 3 ; custom
              
          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()
  If OpenWindow(#WinPref,0,0,400,300,"Preferences",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
    If PanelGadget(#GADGET_PrefPanel,5,5,390,290)
      ;OpenGadgetList(#GADGET_PrefPanel)
      AddGadgetItem(#GADGET_PrefPanel,0,"General")
      AddGadgetItem(#GADGET_PrefPanel,1,"Grille")
      SpinGadget(#GADGET_GridW,5,10,50,20,1,500,#PB_Spin_Numeric)
      SpinGadget(#GADGET_GridH,60,10,50,20,1,500,#PB_Spin_Numeric)
      ButtonGadget(#GADGET_GridColor,120,10,60,20,"Grid Color")
      SetGadgetState(#GADGET_GridW,option\gridW)
      SetGadgetState(#GADGET_GridH,option\gridH)     
      ;CloseGadgetList()
      CloseGadgetList()      
    EndIf
  EndIf  
EndProcedure
Procedure WindowDocResize()
  If OpenWindow(#WinResize,0,0,400,300,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
    Frame3DGadget(#GADGET_WResSiz,10,10,250,150,"Pixel Dimension")
    StringGadget(#GADGET_WResW,80,50,50,20,"",#PB_String_Numeric)
    StringGadget(#GADGET_WResH,80,80,50,20,"",#PB_String_Numeric)
    SetGadgetText(#GADGET_WResW,Str(doc\w))
    SetGadgetText(#GADGET_WResH,Str(doc\h))
    CheckBoxGadget(#GADGET_WResLink,40,120,120,20,"Constraint proportion")
    ButtonGadget(#GADGET_WResbtn,330,20,60,20,"Ok")
    ButtonGadget(#GADGET_WResbtn2,330,45,60,20,"Cancel")
  EndIf  
EndProcedure
Procedure NewTileSet()
  If OpenWindow(#winNewTileset,0,0,400,300,"New Image",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
    Frame3DGadget(#GADGET_WNewTile,10,10,250,150,"Image Dimension")
    StringGadget(#GADGET_WNewW,80,50,50,20,"",#PB_String_Numeric)
    StringGadget(#GADGET_WNewH,80,80,50,20,"",#PB_String_Numeric)
    SetGadgetText(#GADGET_WNewW,Str(doc\w_def))
    SetGadgetText(#GADGET_WNewH,Str(doc\h_def))    
    ButtonGadget(#GADGET_WNewBtnOk,330,20,60,20,"Ok")
    ;ButtonGadget(#GADGET_WResbtn2,330,45,60,20,"Cancel")
  EndIf  
EndProcedure
; save, load
Procedure ConvertImg()
  
EndProcedure
Procedure OpenImg()
  File$ = OpenFileRequester("Load Image...", "", "PNG Images|*.png|JPEG Images|*.jpeg|All Files|*.*", 0)
  If File$
    If LoadImage(#IMAGE_LoadSave, File$)
      doc\w = ImageWidth(#IMAGE_LoadSave)
      doc\h = ImageHeight(#IMAGE_LoadSave)
      StatusBarText(#statubar,1,"Doc : "+Str(doc\w)+"/"+Str(doc\h))
      ClearLayer()
      AddImage()     
      ResizeCanvas(1)     
      If StartDrawing(ImageOutput(#IMAGE_LayerActif))
        DrawingMode(#PB_2DDrawing_AllChannels)
        DrawAlphaImage(ImageID(#IMAGE_LoadSave), 0, 0)
        StopDrawing()
      EndIf      
      
      UpdateScreen()
      FreeImage(#IMAGE_LoadSave)      
    Else
      MessageRequester("CanvasGadget", "Cannot load image: " + File$)
    EndIf
  EndIf
EndProcedure
Procedure ImportImg()
  File$ = OpenFileRequester("Import 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)
      ResizeCanvas()
      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    
    FreeImage(#IMAGE_LoadSave)
  EndIf        
EndProcedure
;}


REMERCIEMENT

- Demivec
- Marco Martin pour l'icone : http://www.iconfinder.com/icondetails/7 ... write_icon
- B Vignoli et Fred pour le code de Base, même si je ne m'en sers plus vraiment ^^.

Le code est fourni en GPL. Vous pouvez le modifier, le changer, l'utiliser, etc.. (en indiquant le nom des auteurs, etc ;)).

N'hésitez pas à l'améliorer si vous le souhaitez ;).
Dernière modification par blendman le mar. 22/oct./2013 18:21, modifié 11 fois.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: TEO (Tile Editor Organisation)

Message par falsam »

J'ai toujours autant de plaisir à tester tes codes. Bravo pour celui-çi.

:arrow: Quand on sauvegarde une image au format PNG, on obtient aussi le JPG.

:arrow: Quand on clique sur le bouton Clear on a bien un reset de l'image mais ...... quand on dessine à nouveau, on récupérer le contenu de l'image précédente.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: TEO (Tile Editor Organisation)

Message par blendman »

falsam a écrit :J'ai toujours autant de plaisir à tester tes codes. Bravo pour celui-çi.
c'est gentil, mais je me suis basé sur le code de Fred (canvas gadget) et un peu de B Vignoli. Après, bien sûr, j'ai pas mal ajouté de chose.

Je me demande toujours si mes codes sont bien ou pas terribles.
J'essaie de faire des codes le plus simple possible, et surtout pour des applications avoir des interfaces intuitives et agréables :)
Bon, là, c'est loin d'être terminé, mais c'est déjà utilisable.
:arrow: Quand on sauvegarde une image au format PNG, on obtient aussi le JPG.

:arrow: Quand on clique sur le bouton Clear on a bien un reset de l'image mais ...... quand on dessine à nouveau, on récupérer le contenu de l'image précédente.
Merci, c'est corrigé !

J'ai ajouté d'autres petites choses :
- ouverture d'image
- redimensionnement de l'image complète

Il reste encore un bug lorsqu'on ouvre une image et qu'on utilise certains outils (box, cercle..). Mais là, j'essaie d'ajouter le zoom (je pense utiliser l'exemple que j'avais trouvé sur le forum ^^)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: TEO (Tile Editor Organisation)

Message par blendman »

salut

Voici les quelques ajouts du TEO (Tile Editor Organisation (Opensource)) :

- conversion d'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). Merci à Case :D
- ajout du zoom (zoom sur le canvas) : ça bug pas mal, je dois revoir le système. Lorsque l'on dessine, pour le moment, il dessine sur l'image resizée et non sur l'originale. Donc si ensuite on zoome ou dé-zoome, ben, ça berdoule forcément.
- redimensionner une image : ajout du choix du mode de redimensionnement (smooth ou hard)
- j'ai commencé à revoir le système de painting (bon, c'était pas trop le but principal du programme, mais j'en profite pour l'améliorer un peu) : on peut utiliser des brush personnalisés (voir le répertoire "brush\blendman). on peut changer de brush avec les touche X et C. pour le moment, je n'ai pas terminé le système pour que le brush prenne la couleur choisie.
- ajout d'un fichier de préférences : permet de sauvegarder quelques informations et les ouvrir lorsque l'on réouvre le soft.
- on peut bouger le canvas, comme avec photoshop (espace): par contre, ça flicke énormément ! quelqu'un pourrait me dire ce qu'il faut faire pour éviter ça ?

Pour le téléchargement, c'est toujours le même lien du 1er message.

je ne fais qu'updater le zip ;).
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Re: TEO (Tile Editor Organisation)

Message par beauregard »

Pas encore testé, mais je te félicite pour le partage et l'élaboration de cet outils, on voit qu'il est bien pensé. :)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: TEO (Tile Editor Organisation)

Message par blendman »

salut

Pour les besoin d'un éditeur de jeu que je suis en train de concevoir, j'ai retravaillé sur mon logiciel d'image (TEO).

Voici donc la dernière version, avec pas mal de nouveautés (j'ai tout repris à zéro) :
http://host-a.net/u/blendman/Teo_V0.228.zip

Un petit screenshot
Image

La liste des nouveautés
- outil : selection, bouger (canvas/layer), zoom, dégradé, spray
- opération de calque (ajouter, supprimer, dupliquer...)
- couper, copier, coller
- toolbar bougeable
- roughboard, selecteur couleur (à revoir)
etc...

N'hésitez pas à lire le fichier Todolist.rtf (dans data\txt\fr) qui contient aussi un récapitulatif des ajouts et changements.
Les bugs à corriger y sont listés (pas tous, mais presque).

Version testée sous windows8 x86.

C'est un réel plaisir de coder en purebasic, ça va vite, c'est puissant, stable, bref top.

Ce n'est pas encore optimisé, donc, les images > 256*256 rament assez vite, surtout si on a plein de calques.
Si on avait un canvas avec gestion de la transparence, ce serait résolu et ce serait d'ailleurs génialissime !, Fred si tu me lis :mrgreen:
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: TEO (Tile Editor Organisation)

Message par falsam »

Bonsoir Blendman. Joli cette version. Je commence à explorer et voila ma première question : L'icone T c'est pour placer du texte ?
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: TEO (Tile Editor Organisation)

Message par blendman »

falsam a écrit :Je commence à explorer et voila ma première question : L'icone T c'est pour placer du texte ?
oui, ce sera pour le futur outil texte (pas encore fonctionnel).

Voici les bugs connus que je dois corriger et les fonctions qui ne sont pas encore disponibles :

Bugs à corriger :

1. Selection négative efface la partie du dessin dessous
2. Zoom et déplacement de calque : le brush ne prend pas le zoom en compte
3. Outil zoom bug
4. Menu calques : fusionner avec le calque inférieur : supprime le calque sans le fusionner
5. les blendmode ne sont pas updatés en temps réel, il faut changer de blendmode pour voir le changement
6. bug lié au crop : qd on sauvegarde, l'image reste à l'ancien format.

Outils/fonctions pas encore fonctionnels :
1. Tampon
2. Particules
3. Forme libre
4. Texte
5. Changer la taille de la sélection
6. Menu> transformation : changer la couleur de l'image
7. Menu Aide : Aide
8. Menu calques : fusionner tous les calques
9. Menu Fichier: préférences
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: TEO (Tile Editor Organisation)

Message par blendman »

salut

J'ai mis à jour mon logiciel de dessin TEO.

Les nouveautés
- outil tampon : permet de dessiner avec un motif (pattern). ON choisit le motif dans l'onglet "pattern" (du côté des onglets couleurs/swatch...)
- Brush : optimisation du trait, ajout de la rotation
- ajout de type d'outil : blur, pixel, glass, noise
- ajout d'un filtre : noise
- transformation : désaturation, inversion de couleur, balance des couleurs (bugué)
- outil sélection fonctionne, on peut dessiner sur la sélection, etc..
- début de la fenêtre de préférence
- corrections de plusieurs bugs (voir message précédent)
- calque : fusionner les calques invisibles, fusionner tous les calques

Download
http://host-a.net/u/blendman/Teo.zip

Screenshots
Image


Bugs à corriger
1. Outil zoom bug avec control
2. les blendmode ne sont pas updatés en temps réel, il faut changer de blendmode pour voir le changement
3. Tooltip des outils que en fr
4. mettre dans les options ce qui correspond au brush (scatter/pas)
5. Bug avec sélection : desaturation, color balance
6. Menu> transformation : changer la couleur de l'image à revoir

Outils/fonctions pas encore fonctionnels
1. Particules
2. Forme libre
3. Texte
4. Changer la taille de la sélection
5. Menu Aide : Aide
Avatar de l’utilisateur
SPH
Messages : 4723
Inscription : mer. 09/nov./2005 9:53

Re: TEO (Tile Editor Organisation)

Message par SPH »

Bravo blendman, tu es tres prolifique !! :idea:
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: TEO (Tile Editor Organisation)

Message par Backup »

ça a l'air bien cool en effet :)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: TEO (Tile Editor Organisation)

Message par blendman »

salut

Voici une nouvelle version.

Nouveautés
- outil texte : on peut ajouter un calque de texte, changer le texte, la couleur de la police, la police, son style, etc..
- l'affichage des calques est modifié : ce n'est plus une liste mais un scrollarea avec des imagegadgets pour chaque layer. ON voit donc désormais des icones sur le calque, ainsi qu'une miniature de l'image du calque correspondant.
- UI : j'ai ajouté dans les options des outils le scatter et l'espace entre les points.
- ajout de raccourcis : X/C pour changer les brosses, 1 : réduit la taille de la brosse, 2 : augmente la taille.
- en cliquant sur la couleur Foreground, on ouvre un colorrequester() pour changer cette couleur.
- avec l'outil "bouger le calque", les flèches permettent de le bouger au pixel près
- Menu transformation : contraste/luminosité (merci Dobro et LSI)
- Menu Affichage : on peut afficher ou non les toolbar (fichier et outils) ainsi que la barre d'état.
- Désormais, la position des toolbar est sauvegardé à la fermeture et replacée à l'ouverture du logiciel.
- quelques corrections de bugs par ci par là.

Download
http://host-a.net/u/blendman/Teo.zip

Screenshot
Image

Bugs à corriger
1. Outil zoom bug avec control (pour un zoom -)
2. les blendmode ne sont pas updatés en temps réel, il faut changer de blendmode pour voir le changement
3. Bug avec sélection : desaturation, color balance
4. bug outil hand : canvas décalé par rapport à la souris
5. Bug avec un calque Text et les blendmode : le texte n'apparait que pour le normal


Outils/fonctions pas encore fonctionnels
1. Particules
2. Forme libre
3. Changer la taille de la sélection
4. Menu Aide : Aide


Choses à revoir
1. Menu> transformation : changer la couleur de l'image à revoir
2. Tooltip des outils que en fr
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: TEO (Tile Editor Organisation)

Message par falsam »

ça commence à avoir une allure très pro :)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: TEO (Tile Editor Organisation)

Message par blendman »

falsam a écrit :ça commence à avoir une allure très pro :)
pour l'interface et pas mal de fonctions, oui, c'est pas mal.
Mais niveau optimisation, je n'ai pas encore trouvé comment rendre ça suffisamment fluide pour travailler sur des grandes images.
Au delà de 512*512, ça commence à ramer. J4essaye donc de trouver des techniques pour que ça soit plus rapide et plus fluide, mais pour le moment, c'est pas encore ça ^^.
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: TEO (Tile Editor Organisation)

Message par flaith »

Pas mal du tout, bravo :D

Petit bug (plutot gros en fait) :
* Je commencais a faire un beau dessin (si si) quand j'ai voulu modifier la rotation de la brosse, j'ai voulu supprimer la valeur apres avoir selectionne "36" et puis appuie sur "suppr" et la, plus de dessin, je me retrouve avec une page vierge 8O
* Idem si on selectionne la forme "shape", l'image est supprimee.
* Pour le texte comment dois-je faire pour l'utiliser ?
* Pour selectionner une couleur un simple clic ne suffit pas, je dois cliquer et bouger la souris pour que la couleur soit selectionnee

Voila, bon courage dans la correction des bugs :wink:
Répondre