[OK] Redimensionner un sprite
Publié : mar. 30/juin/2015 11:40
salut
Quand on crée un sprite, on lui donne des dimensions W et H.
Peut-on redimensionner le sprite, c'est à dire changer ces dimensions (internes j'imagine) comme on le fait avec resizeImage() ?
J'ai testé zoomSprite() et transformSprite() mais ni l'un ni l'autre ne modifie les dimensions réelles du sprite (pourtant, spriteWith() et spriteHeight( nous renvoient bien les bonnes dimensions, mais en fait non, le sprite est "juste" agrandi).
Du coup, pour agrandir un sprite, je suis obligé de le supprimer puis de le recréer, c'est quand même balot comme manip.
Il existe une autre technique ou est-ce une fonction manquante ?
EDIT (15/10/2015)
Solution : utiliser une map pour stocker les sprites et recréer le sprite à redimensionner :
Quand on crée un sprite, on lui donne des dimensions W et H.
Peut-on redimensionner le sprite, c'est à dire changer ces dimensions (internes j'imagine) comme on le fait avec resizeImage() ?
J'ai testé zoomSprite() et transformSprite() mais ni l'un ni l'autre ne modifie les dimensions réelles du sprite (pourtant, spriteWith() et spriteHeight( nous renvoient bien les bonnes dimensions, mais en fait non, le sprite est "juste" agrandi).
Du coup, pour agrandir un sprite, je suis obligé de le supprimer puis de le recréer, c'est quand même balot comme manip.
Il existe une autre technique ou est-ce une fonction manquante ?
Code : Tout sélectionner
InitSprite()
screenwidth = 1024
screenheight = 768
OpenWindow(0, 0, 0, screenwidth, screenheight, "Antialiased Line Demo", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If OpenWindowedScreen(WindowID(0),0,0,screenwidth, screenheight)
w = 100
h = 200
CreateImage(0,w,h)
StartDrawing(ImageOutput(0))
DrawingMode(#PB_2DDrawing_AlphaBlend)
Circle(w/2,h/2,40,RGBA(255,120,120,255))
StopDrawing()
CreateSprite(0,w,h)
StartDrawing(SpriteOutput(0))
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawAlphaImage(ImageID(0),0,0)
StopDrawing()
Debug Str(SpriteWidth(0))+"/"+Str(SpriteHeight(0))
w = 200
h = 300
ResizeImage(0,w,h)
ZoomSprite(0,w,h)
StartDrawing(SpriteOutput(0))
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawAlphaImage(ImageID(0),0,0)
StopDrawing()
; with transformSprite() = same result
Debug Str(SpriteWidth(0))+"/"+Str(SpriteHeight(0))
; result should be :
CreateSprite(1,w,h)
StartDrawing(SpriteOutput(1))
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawAlphaImage(ImageID(0),0,0)
StopDrawing()
Repeat
Repeat
event =WaitWindowEvent(1)
Until event = 0 Or event = #PB_Event_CloseWindow
ClearScreen(0)
DisplayTransparentSprite(0,100,100)
DisplayTransparentSprite(1,400,100)
FlipBuffers()
Until event = #PB_Event_CloseWindow
EndIf
EDIT (15/10/2015)
Solution : utiliser une map pour stocker les sprites et recréer le sprite à redimensionner :
Code : Tout sélectionner
InitSprite()
Structure sSprite
Sprite.i ; id du sprite
Image.i ;id de l'image
EndStructure
Global NewMap Sprite.sSprite()
Procedure CreateSprite2(sprite,w,h)
NewSprite = CreateSprite(sprite,w,h,#PB_Sprite_AlphaBlending )
If sprite = #PB_Any
sprite = newsprite
EndIf
; creation of the new sprite
key$ = Str(Sprite)
AddMapElement(sprite(), key$)
Sprite(key$)\Sprite = sprite
Sprite(key$)\Image = -1
ProcedureReturn NewSprite
EndProcedure
Procedure SetSpriteSize(sprite,w,h)
OriginalSpriteId = sprite
key$ = Str(OriginalSpriteId)
Idsprite = Sprite(key$)\Sprite
FreeSprite(Idsprite)
If OriginalSpriteId > 10000
sprite = #PB_Any
EndIf
NewSprite= CreateSprite(sprite,w,h,#PB_Sprite_AlphaBlending)
If sprite = #PB_Any
sprite = NewSprite
EndIf
Sprite(key$)\Sprite = sprite
; puis on redessine le sprite si besoin
If Sprite(key$)\Image <> -1
If StartDrawing(SpriteOutput(sprite))
; erase the sprite
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0,0,OutputWidth(),OutputHeight(),RGBA(0,0,0,0))
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawAlphaImage(ImageID(Sprite(key$)\Image),0,0)
StopDrawing()
EndIf
EndIf
EndProcedure
screenwidth = 640
screenheight = 480
OpenWindow(0, 0, 0, screenwidth, screenheight, "Game", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If OpenWindowedScreen(WindowID(0),0,0,screenwidth, screenheight)=0
MessageRequester("Error", "Can't Open Screen!", 0)
End
EndIf
ui = CreateSprite2(#PB_Any,10,50)
; Change size of the sprite
SetSpriteSize(ui,128,60)
Repeat
Repeat
event = WaitWindowEvent(1)
If event = #PB_Event_CloseWindow
End
EndIf
Until event = 0
DisplayTransparentSprite(ui,100,100)
FlipBuffers()
ClearScreen(RGB(100,100,100))
ForEver