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