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

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
;}