Uhuru : Je crois que je n'ai pas été assez clair
En fait, j'avais écrit ceci :
On ne peut pas afficher un gadget sur le screen, mais à côté oui (si le screen est plus petit que la fenêtre par exemple).
Or, dans ton précédent code tu essayes d'afficher un imageGadget() dans un screen, ce n'est pas possible ou en tout cas, ça ne va pas bien fonctionner ^^.
Sur un screen, il faut afficher des sprites ou éventuellement DESSINER des images (ou d'autres formes comme les box(), circle(), etc (voir la lib 2D drawing)) avec :
Pour dessiner des sprites sur le screen :
Code : Tout sélectionner
ClearScreen(0)
DisplayTransparentSprite(sprite,x,y)
FlipBuffers()
Pour dessiner des images directement sur le screen :
Code : Tout sélectionner
if Startdrawing(Screenoutput())
Drawimage(image,x,y)
DrawalphaImage(image,x,y)
Stopdrawing()
endif
On peut cumuler dessins (images et autre formes (voir lib 2Ddrawing) sur le screen et affichage de sprites sur ce même screen :
Code : Tout sélectionner
screenwidth = 1024
screenheight = 768
If InitSprite() =0
MessageRequester("erreur","impossible d'initialiser directx")
End
EndIf
If OpenWindow(0, 0, 0, screenwidth, screenheight, "Affichage screen", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If UsePNGImageDecoder() : EndIf
If OpenWindowedScreen(WindowID(0),0,0,screenwidth, screenheight)=0
MessageRequester("Error", "Can't Open Screen!", 0)
End
EndIf
Image = LoadImage(#PB_Any, #PB_Compiler_Home + "Examples\3D\Data\purebasic3dlogo.png")
Sprite = LoadSprite(#PB_Any, #PB_Compiler_Home + "Examples\3D\Data\purebasic3dlogo.png",#PB_Sprite_AlphaBlending)
; je définis les deux vitesses pour bouger le sprite et le carré
dir = 2
dirY = 4
Repeat
; très important : d'abord, on vérifie les evènements
Repeat
EventID = WindowEvent()
Select EventID
Case #PB_Event_CloseWindow
End
EndSelect
Until event = 0
; si aucun évènement, on va afficher ce qu'il y a sur le screen
; on d'abord efface le screen
ClearScreen(RGB(120,120,120))
; on peut dessine des formes dessins si besoin : image, box(), circle...,
; mais je déconseille personnellement cette technique,
; il faut mieux dessiner la forme sur un sprite et afficher le sprite, ça ira plus vite
y +dirY
If y >= 500
dirY = -4
ElseIf y <= 0
dirY = 4
EndIf
If StartDrawing(ScreenOutput())
; on modifie le mode d'affichage ( voir drawingmode()) pour afficher l'image
DrawingMode(#PB_2DDrawing_AlphaBlend )
DrawImage(ImageID(image),50,50) ; on dessine l'image sur le screen (ce qui revient à l'afficher, sauf si on efface avant ce même screen avec clearscreen()
DrawingMode(#PB_2DDrawing_AlphaBlend)
Box(20,y,50,50,RGBA(255,120,120,254)) ; on dessine un carré
StopDrawing()
EndIf
; décommente cette ligne pour ne plus voir les formes (on les efface avant de les afficher ^^
; ClearScreen(RGB(120,120,120))
; on peut aussi dessiner des sprites si besoin (c'est d'ailleurs préférable, ça va beaucoup plus vite ;)
x +dir
If x > 300
dir = -2
ElseIf x < 0
dir = 2
EndIf
DisplayTransparentSprite(sprite,x,200)
; et on affiche tout :)
FlipBuffers()
ForEver
EndIf
En fait, une chose importante à retenir c'est ceci :
- si tu utilises OpenScreen(), tu n'as pas réellement de fenêtre, donc tu ne peux afficher aucun gadget, à l'extérieur de ce screen.
- si tu utilises OpenWindowedScreen(), tu ne peux afficher tes gadgets qu'à l'EXTERIEUR de ton screen
Dans ton cas, il est peut-être préférable d'utiliser des sprites, mais si tu veux qu'un layer cache un autre layer, il faudra soit utiliser un cache (voir spriteblendingmode()), soit utiliser des images que tu dessineras sur un sprite, que tu afficheras ensuite sur le screen
- dessiner sur un sprite avec Startdrawing(Spriteoutput(Sprite)) en jouant sur le drawingmode(#PB_2DDrawing_AlphaClip)pour n'afficher qu'une partie de l'image :
Code : Tout sélectionner
screenwidth = 1024
screenheight = 768
If InitSprite() =0
MessageRequester("erreur","impossible d'initialiser directx")
End
EndIf
If OpenWindow(0, 0, 0, screenwidth, screenheight, "Affichage screen", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If UsePNGImageDecoder() : EndIf
If OpenWindowedScreen(WindowID(0),0,0,screenwidth, screenheight)=0
MessageRequester("Error", "Can't Open Screen!", 0)
End
EndIf
Image = LoadImage(#PB_Any, #PB_Compiler_Home + "Examples\3D\Data\purebasic3dlogo.png")
Sprite = LoadSprite(#PB_Any, #PB_Compiler_Home + "Examples\3D\Data\purebasic3dlogo.png",#PB_Sprite_AlphaBlending)
; je définis les deux vitesses pour bouger le sprite et le carré
dir = 2
dirY = 4
Repeat
; très important : d'abord, on vérifie les evènements
Repeat
EventID = WindowEvent()
Select EventID
Case #PB_Event_CloseWindow
End
EndSelect
Until event = 0
; si aucun évènement, on va tout afficher
; on efface le screen
ClearScreen(RGB(120,120,120))
x +dir
If x > 300
dir = -2
ElseIf x < 0
dir = 2
EndIf
If StartDrawing(SpriteOutput(sprite))
; on efface le sprite
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0,0,OutputWidth(),OutputWidth(),RGBA(0,0,0,0))
; on affiche le cercle
Circle(x,25,50,RGBA(254,254,254,254))
DrawingMode(#PB_2DDrawing_AlphaClip )
DrawImage(ImageID(image),0,0) ; on dessine l'image sur le screen (ce qui revient à l'afficher, sauf si on efface avant ce même screen avec clearscreen()
StopDrawing()
EndIf
; on affiche le sprite
DisplayTransparentSprite(sprite,200,200)
; et on affiche tout :)
FlipBuffers()
ForEver
EndIf
Voilà, j'espère que ça pourra t'aider, mais surtout n'hésite pas à bien relire nos explications

Elles sont simples, mais c'est fondamental pour comprendre comment tout ça fonctionne.
EDIT : d'ailleurs, grâce à toi, j'ai trouvé un bug que je vais poster sur le forum, si on utilise RGBA(255,255,255,255), ça affiche du noir, alors que (254,254,254,254), ça affiche bien du blanc ^^.
Edit 2 : @falsam : pourquoi tu utilises plot() ? C'est assez gourmand, pour gérer la transparence d'une image, je pense qu'il est préférable d'utiliser :
Après, pour changer les couleurs par exemple, ça peut être intéressant.