J'ai fait des tests pour dessiner sur un screen avec les sprites et finalement, ce n'est pas le screen qui bug avec la tablette graphique wacom mais les mousex() et mouseY() (initmouse()).
Donc, sans passer par mouseX() et MouseY(), on peut utiliser les screens et les sprites

Bonne nouvelle

Par contre, j'ai quelques questions :
- comment faire dessiner un sprite sur un sprite de manière fluide, car sur mon test avec usebuffer(), ça rame énormément.
- Peut-on dessiner sur un sprite3D ? (je pense que non, mais bon), et sinon, peut-on dessiner avec un canal alpha sur 1 sprite (je crois que non, car seuls les sprites3D gèrent correctement l'alpha type png) et enregistrer le sprite avec ce canal alpha (et donc de la transparence).
- sur mon exemple, lorsque je sauvegarde mon image, ça ne marche pas, et je ne sais pas pourquoi, j'ai juste le fond noir.
Le code :
Code : Tout sélectionner
;{ init
ExamineDesktops()
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSprite3D() = 0 Or UsePNGImageDecoder() =0 Or UsePNGImageEncoder()=0
MessageRequester("Error", "Can't open the sprite system", 0)
End
EndIf
;}
;{ declare
Declare CreateImageFromSprite(Image.l,Sprite.l)
;}
;{ variables
Global sprite_ok.b, playerX.w = -500, playerY.w = -500, usesprite.b
;}
;{ openwindow & create sprite
If OpenWindow(0, 0, 0, DesktopWidth(0), DesktopHeight(0), "Dessiner sur un sprite", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_Maximize)
;{ menu
If CreateMenu(0,WindowID(0))
MenuTitle("mode")
MenuItem(0,"Dessiner sur le sprite")
MenuItem(1,"Utiliser Usebuffer()")
MenuItem(2,"Dessiner sur le screen")
EndIf
;}
;{ screen & sprite
If OpenWindowedScreen(WindowID(0), 150, 70, 800,600, 0, 0, 0)
LoadSprite(0, "2.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture)
CreateSprite3D(0,0)
Global centreX =SpriteWidth(0)/2
Global centrey =SpriteHeight(0)/2
CreateSprite(1,1024,1024,#PB_Sprite_AlphaBlending|#PB_Sprite_Texture)
CreateSprite3D(1,1)
Else
MessageRequester("Error", "Can't open windowed screen!", 0)
End
EndIf
;}
EndIf
;}
;{ boucles
Repeat
Repeat
Event = WindowEvent()
Select Event
Case #WM_LBUTTONDOWN
sprite_ok = 1
Case #WM_LBUTTONUP
sprite_ok = 0
GrabSprite(1,0,0,1000,1000,32)
SaveSprite(1,"testsave.png",#PB_ImagePlugin_PNG)
;UseBuffer(#PB_Default)
Case #WM_MOUSEMOVE
If sprite_ok = 1
playerX = WindowMouseX(0)-150 - centreX
playerY = WindowMouseY(0)-70 - centreY
If usesprite = 1
UseBuffer(1)
Start3D()
DisplaySprite3D(0, playerX, playerY)
Stop3D()
ElseIf usesprite = 0 ;<<<<<<<<<<<<<<<<<<<<-------------------- ici, ça bug
StartDrawing(SpriteOutput(1))
;DrawingMode(#PB_2DDrawing_Transparent)
DisplaySprite(0,playerX, playerY)
StopDrawing()
EndIf
EndIf
Case #PB_Event_CloseWindow
Quit = 1
Case #PB_Event_Menu
Select EventMenu()
Case 0,1,2
usesprite = EventMenu()
EndSelect
EndSelect
Until Event = 0
ExamineKeyboard()
Start3D()
DisplaySprite3D(0, playerX, playerY)
Stop3D()
FlipBuffers()
Until Quit Or KeyboardPushed(#PB_Key_Escape)
;}
;{ procedures
Procedure CreateImageFromSprite(Image.l,Sprite.l)
;by octavius
Protected hDC.l,Bmp.BITMAP,hBmp.l
If IsSprite(Sprite)
hDC=StartDrawing(SpriteOutput(Sprite))
Bmp\bmWidth=SpriteWidth(Sprite)
Bmp\bmHeight=SpriteHeight(Sprite)
Bmp\bmPlanes=1
Bmp\bmBitsPixel=GetDeviceCaps_(hDC,#BITSPIXEL)
Bmp\bmBits=DrawingBuffer()
Bmp\bmWidthBytes=DrawingBufferPitch()
hBmp=CreateBitmapIndirect_(Bmp)
StopDrawing()
CreateImage(Image,SpriteWidth(Sprite),SpriteHeight(Sprite))
StartDrawing(ImageOutput(Image))
DrawImage(hBmp,0,0)
StopDrawing()
DeleteObject_(hBmp)
EndIf
EndProcedure
;}
