[ok]Sprite : rotate un sprite autour d'un autre+ sa rotation
Publié : sam. 19/mars/2016 9:35
Salut
Voilà, j'aimerai concevoir un système de bones pour créer des animations de sprites.
Pour ça, j'ai besoin
- d'avoir un sprite qui peut faire une rotation en fonction de la rotation d'un autre sprite (dans mon exemple, il tourne autour du sprite)
- que ce sprite puisse tourner sur lui-même en plus.
En gros, comme une lune qui tournerait autour d'une planète qui tourne sur elle-même.
J'ai donc repris le code fourni par Stargate qui permet de faire une rotation en un centre précis.
J'arrive donc à faire tourner le sprite rouge autour du sprite normal, mais je n'arrive pas à faire tourner en même temps le sprite rouge sur lui-même.
Auriez-vous une idée pour réaliser ça ?
En gros, voici ce que je cherche à obtenir en finalité :

Si vous avez des pistes ou une idées, ça m'intéresse grandement
Voilà, j'aimerai concevoir un système de bones pour créer des animations de sprites.
Pour ça, j'ai besoin
- d'avoir un sprite qui peut faire une rotation en fonction de la rotation d'un autre sprite (dans mon exemple, il tourne autour du sprite)
- que ce sprite puisse tourner sur lui-même en plus.
En gros, comme une lune qui tournerait autour d'une planète qui tourne sur elle-même.
J'ai donc repris le code fourni par Stargate qui permet de faire une rotation en un centre précis.
J'arrive donc à faire tourner le sprite rouge autour du sprite normal, mais je n'arrive pas à faire tourner en même temps le sprite rouge sur lui-même.
Auriez-vous une idée pour réaliser ça ?
Code : Tout sélectionner
#Window_main = 0
If InitSprite() =0 Or InitKeyboard() =0
End
EndIf
Procedure SpriteTransformation(Sprite.i, X.f, Y.f, Width.f, Height.f, Angle.f)
Protected Cos.f = Cos(Radian(Angle))
Protected Sin.f = Sin(Radian(Angle))
TransformSprite(Sprite, X*Cos-Y*Sin, X*Sin+Y*Cos, (X+Width)*Cos-Y*Sin, (X+Width)*Sin+Y*Cos, (X+Width)*Cos-(Y+Height)*Sin, (X+Width)*Sin+(Y+Height)*Cos, X*Cos-(Y+Height)*Sin, X*Sin+(Y+Height)*Cos)
EndProcedure
flag = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget
WinW =800
WinH =600
If OpenWindow(#Window_main,0,0,WinW,WinH, "Sprite", Flag) = 0
End
EndIf
If OpenWindowedScreen(WindowID(0), 0,0,WinW,WinH) = 0
End
EndIf
LoadSprite(0,#PB_Compiler_Home+"Examples\Sources\Data\PurebasicLogo.bmp")
CopySprite(0,1)
W =SpriteWidth(0)
H =SpriteHeight(0)
r.d = 0.2
ZoomSprite(1,w*r,h*r)
ZoomSprite(0,w*r,h*r)
x = 100
dir = 1
y = 300
Repeat
Repeat
EventID = WindowEvent()
Select EventID
Case #PB_Event_CloseWindow
End
EndSelect
Until event = 0
ClearScreen(RGB(100,100,100))
x+dir
If x > 500
dir = -dir
ElseIf x <50
dir = -dir
EndIf
a+1
If a > 360
a = 0
EndIf
b +1
If b> 360
b = 0
EndIf
RotateSprite(1,b,0) ; c'est annuler par la procédure en dessous
SpriteTransformation(1, -100,-100, w*r, h*r ,b)
;
DisplayTransparentSprite(1,50+x,y,255,#Red)
RotateSprite(0,a,0)
DisplaySprite(0,x,y)
FlipBuffers()
Until Quit = 1

Si vous avez des pistes ou une idées, ça m'intéresse grandement
