gestion animation sprites par threads
Publié : mer. 24/févr./2010 0:27
une question a la con, est-ce que gérer l'animation de sprites via des threadd est une bonne facon de procéder ?
en gros si le sprite est animé et que j'ai mis le flag auto ca genere un thread qui anime le sprite independament du reste du programme
le sprite est ensuite affiché comme ca
Code : Tout sélectionner
Procedure newsprite(id,image.s,x,y,l,h,frames=1,timer=1,auto=0,transp=$ff00ff)
ClearScreen(0) ; efface l'ecran
*mem=*memory+freemem ; calcule l'adresse dans le buffer en memoire ou est stocké l'adresse du sprite
If IsImage(Val(image)) ; si une image existe avec la valeur de la chaine image deja en memoire
img=ImageID(Val(image)) ; +--
StartDrawing(ScreenOutput()) ; !
DrawImage(img,0,0) ; !affiche l'image
StopDrawing() ; +--
ElseIf FileSize(image) ; sinon on verifie qu'un fichier existe avec le nom de l'image
temp=LoadImage(#PB_Any,image) ; on charge l'image
img=ImageID(temp) ; +--
StartDrawing(ScreenOutput()) ; !
DrawImage(img,0,0) ; !affiche l'image
StopDrawing() ; +--
FreeImage(temp) ; libere la memoire
EndIf
; ------------ genere les sprites -----------------------
For frame=1 To frames ; pour chaque frame
sprite=GrabSprite(#PB_Any,x+((frame-1)*l),y,l,h) ; on grab un sprite
TransparentSpriteColor(sprite, transp) ; on defini la couleur transparente
PokeI(*memory+freemem,sprite) ; on ecrit l'adresse du sprite en memoire
freemem+8 ; on incremente l'offset du bloc memoire
Next
sprites(id)\Memstart=*mem ; on ecrit l'adresse de depart du sprite dans le buffer memoire
sprites(id)\frames=frames ; on ecrit le nombre de frames
sprites(id)\frametimer=timer ; on ecrit le timer
sprites(id)\thisframe=0 ; frame actuelle
; -------------------- animation automatique ----------------------------
If auto=1 ; si animation automatique (par thread)
If frames>1 ; et si il y aplusieur frames
CreateThread(@updatesprites(),id) ; creation d'un thread pour animer ce sprite
EndIf
EndIf
EndProcedure
Code : Tout sélectionner
Procedure updatesprites(*nb)
nb_frames=sprites(*nb)\frames
count=sprites(*nb)\frametimer
Repeat
Delay(10) ;<------ pas sur que ce soit super propre
fr+1
If fr>=count
fr=0
frame+1
If frame<nb_frames
sprites(*nb)\thisframe =frame
Else
sprites(*nb)\thisframe =0
frame=0
EndIf
EndIf
ForEver ;<--------------- je sais que c'est déconseillé
EndProcedure
Code : Tout sélectionner
Procedure showsprite(nb,x,y)
If sprites(nb)\Memstart<>0
sprite= PeekI(sprites(nb)\Memstart+(((sprites(nb)\thisframe))*8))
If IsSprite(sprite)
DisplayTransparentSprite(sprite,x,y)
EndIf
EndIf
EndProcedure