J'avais fait des tests et dessiner sur le screen des grandes images (même une seule) c'est beaucoup moins rapide que dessiner une image (pas trop grande, comme une brosse de pinceau) sur un sprite puis afficher les sprites
.
En testant ce code-ci, on voit clairement que dessiner sur un screen est plus lent et c'est encore plus visible si tu ajoutes deux ou 3 calques
Code : Tout sélectionner
; Animatoon : exemple basique du code pour dessiner.
;{ enumeration
Enumeration ; menuitem
#menu_Clear
#menu_LayerAdd
#Menu_Technic
EndEnumeration
Enumeration ; gadgets
#G_BrushSize
#G_BrushAlpha
#G_BrushColor
#G_layerList
EndEnumeration
#SpFond = 0
#ImgBrushColor = 0
;}
;{ structure
Structure sBrush
Size.w
Alpha.a
Scatter.w
Rotation.w
Color.i
R.a
G.a
b.a
EndStructure
Global brush.sBrush
With brush
\size = 10
\Alpha = 120
\r = Random(255)
\g = Random(255)
\b = Random(255)
\Color = RGBA(\r,\g,\b,\Alpha)
EndWith
Structure sLayer
Alpha.a
View.a
Bm.a
Position.a
Image.i
ImageAlpha.i
Sprite.i
Gadget.i
X.w
y.w
Nom$
W.w
H.w
EndStructure
Global Dim layer.sLayer(0)
;}
Global doc_w,doc_h,layerId,NewPainting,canvasX,canvasY,Zoom.w
doc_w = 1024
doc_h = 768
Zoom = 100
;{ procedures
Procedure Layer_Add()
n =ArraySize(layer())
With layer(n)
\Alpha = 255
\view = 1
\Position = n
\Nom$ = "Layer"+Str(n)
\Image = CreateImage(#PB_Any, doc_w, doc_h, 32,#PB_Image_Transparent)
\ImageAlpha = CreateImage(#PB_Any, doc_w, doc_h, 32,#PB_Image_Transparent)
\Sprite = CreateSprite(#PB_Any, doc_w,doc_h,#PB_Sprite_AlphaBlending)
If StartDrawing(SpriteOutput(\Sprite)) ; on efface le sprite
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0,0,doc_w,doc_h,RGBA(0,0,0,0))
StopDrawing()
EndIf
layerId = n
EndWith
ClearGadgetItems(#G_layerList)
For i =0 To n
AddGadgetItem(#G_layerList,i,layer(i)\Nom$)
Next i
ReDim layer(n+1)
EndProcedure
Procedure Layer_Draw(i)
z.d =Zoom *0.01
Select layer(i)\Bm
Case 0
SpriteBlendingMode(#PB_Sprite_BlendSourceAlpha, #PB_Sprite_BlendInvertSourceAlpha)
Case 1 ; multiply
SpriteBlendingMode(4,0)
Case 2 ; Add
SpriteBlendingMode(3,1)
EndSelect
ZoomSprite(layer(i)\Sprite,z*ImageWidth(layer(i)\Image),z*ImageHeight(layer(i)\Image))
DisplayTransparentSprite(layer(i)\Sprite,layer(i)\x+canvasX,layer(i)\y+canvasY,layer(i)\Alpha)
SpriteBlendingMode(#PB_Sprite_BlendSourceAlpha, #PB_Sprite_BlendInvertSourceAlpha)
EndProcedure
Procedure Layer_Update(i)
EndProcedure
Procedure ScreenUpdate()
If NewPainting
If StartDrawing(SpriteOutput(Layer(layerId)\Sprite)) ; on efface le sprite
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0,0,doc_w,doc_h,RGBA(0,0,0,0))
DrawAlphaImage(ImageID(layer(layerid)\Image),0,0)
StopDrawing()
EndIf
NewPainting = 0
EndIf
ClearScreen(RGB(120,120,120))
DisplayTransparentSprite(#SpFond,canvasX,canvasY)
For i= 0 To ArraySize(layer())-1
Layer_draw(i)
Next i
FlipBuffers()
EndProcedure
Procedure UpdateColorPreview()
If StartDrawing(ImageOutput(#ImgBrushColor))
Box(0,0,OutputWidth(),OutputHeight(),RGB(brush\R,brush\G,brush\B))
StopDrawing()
EndIf
SetGadgetState(#G_BrushColor,ImageID(#ImgBrushColor))
EndProcedure
;}
;{ openwindow
screenwidth = 1200
screenheight = 768
OpenWindow(0, 0, 0, screenwidth, screenheight, "Animatoon base", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget)
InitSprite()
ScreenX = 100
ScreenY = 0
If OpenWindowedScreen(WindowID(0),ScreenX,ScreenY,screenwidth-ScreenX-100, screenheight)=0
MessageRequester("Error", "Can't Open Screen!", 0)
End
EndIf
;{ menu
If CreateMenu(0,WindowID(0))
MenuTitle("Editions")
MenuItem(#Menu_Clear,"Effacer")
MenuItem(#Menu_Technic,"Draw on screen)")
MenuTitle("Calques")
MenuItem(#Menu_LayerAdd,"Ajouter calque")
EndIf
;}
;{ gadgets
If PanelGadget(#PB_Any,0,0,ScreenX-5,WindowHeight(0))
x = 10
y = 10
SpinGadget(#G_BrushSize,x,y,50,20,1,500,#PB_Spin_Numeric):y+25
GadgetToolTip(#G_BrushSize,"Taille de la brosse")
SetGadgetState(#G_BrushSize,brush\Size)
SpinGadget(#G_BrushAlpha,x,y,50,20,0,255,#PB_Spin_Numeric):y+25
GadgetToolTip(#G_BrushAlpha,"Opacité de la brosse")
SetGadgetState(#G_BrushAlpha,brush\Alpha)
If CreateImage(#ImgBrushColor,64,64)
ImageGadget(#G_BrushColor,x,y,64,64,ImageID(#ImgBrushColor))
UpdateColorPreview()
EndIf
CloseGadgetList()
EndIf
If PanelGadget(#PB_Any,WindowWidth(0)-95,0,105,WindowHeight(0))
x = 10
y = 10
ListViewGadget(#G_layerList,x,y,80,100)
CloseGadgetList()
EndIf
;}
;{ autre
If CreateSprite(#SpFond,Doc_w,doc_h,#PB_Sprite_AlphaBlending)
If StartDrawing(SpriteOutput(#SpFond))
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0,0,doc_w,doc_h,RGBA(160,160,160,255))
StopDrawing()
EndIf
EndIf
Layer_Add()
ScreenUpdate()
;}
;}
Repeat
mx = WindowMouseX(0) - ScreenX
my = WindowMouseY(0) - ScreenY
Repeat
Event = WaitWindowEvent(1)
EventGadget = EventGadget()
Select event
Case #PB_Event_Gadget
Select EventGadget
Case #G_layerList
LayerId =GetGadgetState(#G_layerList)
Case #G_BrushSize
brush\Size = GetGadgetState(#G_BrushSize)
Case #G_BrushAlpha
brush\Alpha = GetGadgetState(#G_BrushAlpha)
brush\color =RGBA(brush\r,brush\g,brush\b,brush\Alpha)
Case #G_BrushColor
If EventType() = #PB_EventType_LeftDoubleClick
col = ColorRequester(brush\color)
brush\r = Red(Col)
brush\g = Green(Col)
brush\b = Blue(Col)
brush\color =RGBA(brush\r,brush\g,brush\b,brush\Alpha)
UpdateColorPreview()
EndIf
EndSelect
Case #PB_Event_Menu
Select EventMenu()
Case #Menu_Technic
technic = 1-technic
For i =0 To ArraySize(layer())-1
NewPainting = 1
ScreenUpdate()
Next
Case #menu_Clear
If StartDrawing(ImageOutput(Layer(layerId)\Image)) ; on efface le sprite
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0,0,doc_w,doc_h,RGBA(0,0,0,0))
StopDrawing()
EndIf
NewPainting = 1
ScreenUpdate()
Case #menu_LayerAdd
Layer_Add()
EndSelect
Case #PB_Event_LeftClick ; mouse button up
paint = 0
Case #WM_LBUTTONDOWN ; mouse button down : pas d'équivalent event général
If mx>=0 And my>=0 And mx<ScreenWidth() And my<ScreenHeight()
paint = 1
EndIf
Case #PB_Event_CloseWindow
End
EndSelect
Until event = 0 Or paint = 1
If mx>=0 And my>=0 And mx<ScreenWidth() And my<ScreenHeight()
If paint = 1
; on peint, j'update donc
ClearScreen(RGB(120,120,120))
If technic = 1
DisplayTransparentSprite(#SpFond,canvasX,canvasY)
For i= 0 To ArraySize(layer())-1
If i< layerId
Layer_draw(i)
Else
Break
EndIf
Next i
; je peins sur le sprite, attention c'est temporaire, uniquement pour l'affichage rapide.
If StartDrawing(SpriteOutput(layer(layerid)\Sprite))
DrawingMode(#PB_2DDrawing_AlphaBlend)
xx = mx + Random(brush\Scatter)-Random(brush\Scatter)
yy = my + Random(brush\Scatter)-Random(brush\Scatter)
Circle(xx,yy,Brush\size,brush\color)
StopDrawing()
EndIf
Else
xx = mx + Random(brush\Scatter)-Random(brush\Scatter)
yy = my + Random(brush\Scatter)-Random(brush\Scatter)
EndIf
; puis je peins sur l'image, que je conserve
If StartDrawing(ImageOutput(layer(layerid)\Image))
DrawingMode(#PB_2DDrawing_AlphaBlend)
;xx = mx - Brush\size + Random(brush\Scatter)-Random(brush\Scatter)
;yy = my - Brush\size + Random(brush\Scatter)-Random(brush\Scatter)
Circle(xx,yy,Brush\size,brush\color)
StopDrawing()
EndIf
If technic = 1
For i= layerId To ArraySize(layer())-1
layer_draw(i)
Next i
Else
If StartDrawing(ScreenOutput())
;DrawingMode(#PB_2DDrawing_AlphaBlend)
Box(0,0,OutputWidth(),OutputHeight(),RGB(160,160,160))
For i= 0 To ArraySize(layer())-1
DrawAlphaImage(ImageID(layer(i)\Image),0,0,layer(i)\Alpha)
Next i
StopDrawing()
EndIf
EndIf
FlipBuffers()
Else
EndIf
EndIf
; autre : keyboards par exemple
Until Event = #PB_Event_CloseWindow
Tu veux dire dessiner un sprite sur une image ? ou dessiner une image sur le screen ?
Car on ne peut pas dessiner un sprite sur une image, il me semble.
Moi, j'aimerai dessiner un sprite sur une surface directX/openGL, là ça irait super vite, ce serait top
.