Puretools : Animsprite
Puretools : Animsprite
Je voudrais utiliser la librairie Puretools pour animer mes sprites
mais il n'y a pas de commande pour supprimer un sprite animé.
Dans les exemples il utilise un flag pour afficher ou non un sprite animé, il existe toujours. C'est vraiment pas genial.
Y a t il un moyen de supprimer un 'anim sprite' sans les commandes de la lib (puisque de toutes facons la commande n'existe pas...) ?
Ou peut-on rajouter une commande à cette lib ?
Ou je ne sais pas quoi encore...
mais il n'y a pas de commande pour supprimer un sprite animé.
Dans les exemples il utilise un flag pour afficher ou non un sprite animé, il existe toujours. C'est vraiment pas genial.
Y a t il un moyen de supprimer un 'anim sprite' sans les commandes de la lib (puisque de toutes facons la commande n'existe pas...) ?
Ou peut-on rajouter une commande à cette lib ?
Ou je ne sais pas quoi encore...
je ne connais pas cette lib , mais apparemment elle utilise les sprites que tu charges avec des commandes de purebasic ?
si tu veux supprimer le sprite , utilise freesprite().
L'animation en elle même , c'est juste une variable qui utilise la structure animation. tu devrais pouvoir réutiliser cette variable pour faire une autre animation .
En fait , je ne comprends pas trop ton problème
si tu veux supprimer le sprite , utilise freesprite().
L'animation en elle même , c'est juste une variable qui utilise la structure animation. tu devrais pouvoir réutiliser cette variable pour faire une autre animation .
En fait , je ne comprends pas trop ton problème

Effectivement elle utilise les sprites de purebasic :
tu charge un sprite : loadsprite(num_sprite,"nom.bmp")...
"nom.bmp contient toutes les images de l'anim,les unes a la suite des autres.
puis : createanimsprite(num_anim,num_sprite,x_size,y_size[,delay])
et displayanimsprite(num_anim,x,y)
oui, pour supprimer le sprite : freesprite() mais l'anim continue à tourner, sans image...
Je vais suivre ton conseil, réutiliser les mêmes numero d'anim.
Mais, si à un moment du jeu j'ai par exemple 30 sprite animé pour les explosions, et que ensuite je n'en ai plus que 2 les 28 restantes vont tourner à vide...
C'est vrai qu'elles ne seront pas visible mais toujours en mémoire, donc pour l'optimisation c'est pas terrible...
J'aurais bien utliser les particules pour les explosions et autres mais c'est vraiment pas de chance, FreeParticleEmitter() ne fonctionne pas non plus

tu charge un sprite : loadsprite(num_sprite,"nom.bmp")...
"nom.bmp contient toutes les images de l'anim,les unes a la suite des autres.
puis : createanimsprite(num_anim,num_sprite,x_size,y_size[,delay])
et displayanimsprite(num_anim,x,y)
oui, pour supprimer le sprite : freesprite() mais l'anim continue à tourner, sans image...
Je vais suivre ton conseil, réutiliser les mêmes numero d'anim.
Mais, si à un moment du jeu j'ai par exemple 30 sprite animé pour les explosions, et que ensuite je n'en ai plus que 2 les 28 restantes vont tourner à vide...
C'est vrai qu'elles ne seront pas visible mais toujours en mémoire, donc pour l'optimisation c'est pas terrible...
J'aurais bien utliser les particules pour les explosions et autres mais c'est vraiment pas de chance, FreeParticleEmitter() ne fonctionne pas non plus





c'est juste une Procédure , si tu ne l'appelles pas , il ne se passe rien !Mais, si à un moment du jeu j'ai par exemple 30 sprite animé pour les explosions, et que ensuite je n'en ai plus que 2 les 28 restantes vont tourner à vide...
tu peux te faire ta propre procédure d'animation , à mon avis , DisplayAnimSprite() doit ressembler à un truc comme ça :
Code : Tout sélectionner
Procedure Animation()
Static OldNo
Gus\No = Gus\Animation + Gus\Sens + Gus\Direction ; No de l'animation en cours
If OldNo <> Gus\No
; init l'animation
AnimeGus(OldNo)\Compteur = 0
AnimeGus(OldNo)\ImageEnCours = AnimeGus(OldNo)\ImageDebut
AnimeGus(OldNo)\TempsEnCours = ElapsedMilliseconds()
OldNo = Gus\No
EndIf
If ElapsedMilliseconds() - AnimeGus(Gus\No)\TempsEnCours > AnimeGus(Gus\No)\TempsMaxi
AnimeGus(Gus\No)\ImageEnCours + 1
AnimeGus(Gus\No)\TempsEnCours = ElapsedMilliseconds()
If AnimeGus(Gus\No)\ImageEnCours > AnimeGus(Gus\No)\ImageFin
; On boucle ?
If AnimeGus(Gus\No)\Repetition = 0
AnimeGus(Gus\No)\ImageEnCours = AnimeGus(Gus\No)\ImageBoucle
Else
; Compte le nombre de répétition
AnimeGus(Gus\No)\Compteur + 1
; Si le nombre de répétition est atteint , on reste sur la dernière image
If AnimeGus(Gus\No)\Compteur >= AnimeGus(Gus\No)\Repetition
AnimeGus(Gus\No)\ImageEnCours = AnimeGus(Gus\No)\ImageFin
Else
;Sinon on reboucle
AnimeGus(Gus\No)\ImageEnCours = AnimeGus(Gus\No)\ImageBoucle
EndIf
EndIf
EndIf
EndIf
ClipX = AnimeGus(Gus\No)\Taillex * AnimeGus(Gus\No)\ImageEnCours
ClipSprite(AnimeGus(Gus\No)\Sprite, ClipX, 0, AnimeGus(Gus\No)\Taillex, AnimeGus(Gus\No)\TailleY)
DisplayTransparentSprite(AnimeGus(Gus\No)\Sprite, Gus\X - AnimeGus(Gus\No)\PChaudX, Gus\Y - AnimeGus(Gus\No)\PChaudY)
EndProcedure
ma structure animation se présente ainsi :
Code : Tout sélectionner
Structure Animation
Nom$ ; Nom de l'animation
Sprite.l ; No du sprite utilisé pour l'animation
ImageEnCours.l ; No de l'image en cours
ImageDebut.l ; No de la première image de l'animation
ImageFin.l ; No de la dernière image de l'animation
ImageBoucle.l ; Si répétition = 0 , l'animation boucle sur cette image
Repetition.l ; 0 => l'animation boucle sur ImageBoucle , >0 => indique le nombre de répétition à réaliser
Compteur.l ; Compteur répétition
Taillex.l ; Dimension en X de chaque image
TailleY.l ; Dimension en Y de chaque image
TempsEnCours.l ; Durée d'affichage de l'image en cours
TempsMaxi.l ; Durée d'affichage d'une image
PChaudX.l ; Point Chaud en X => Point de référence pour l'affichage
PChaudY.l ; Point Chaud en Y => Point de référence pour l'affichage
PActionX.l ; Point Action en X => Point de départ du tir ( ou d'une autre action )
PActionY.l ; Point Action en Y => Point de départ du tir ( ou d'une autre action )
EndStructure
bon j'ai des trucs en plus , comme la gestion du point chaud et du point action d'un sprite.
Comme ça tu as une idée de ce qu'il y a à faire pour animer un sprite , si un jour l'envie te vient , de le faire par toi-même

La librairie AnimSprite utilise dans son animation d’une part le sprite chargé avec LoadSprite() et d’autre part la structure *AnimSprite.
A chaque appel de DisplayAnimSprite(*AnimSprite, x,y), le moteur d’animation travail avec les informations contenues dans *AnimSprite (numero ID du sprite, nbre d’images, etc…), à la maniere de l’exemple de comtois.
Ainsi pour détruire un AnimSprite, il faut détruire le sprite et ne plus appeler DisplayAnimSprite (qui d’ailleurs n’a plus d’intérêt puisque le sprite n’existe plus)…
A chaque appel de DisplayAnimSprite(*AnimSprite, x,y), le moteur d’animation travail avec les informations contenues dans *AnimSprite (numero ID du sprite, nbre d’images, etc…), à la maniere de l’exemple de comtois.
Ainsi pour détruire un AnimSprite, il faut détruire le sprite et ne plus appeler DisplayAnimSprite (qui d’ailleurs n’a plus d’intérêt puisque le sprite n’existe plus)…
Au pir, si tu veux vraiment libérer tout l'espace memoire pris par une anim, il te suffit d'allouer un espace memoire, et dès que tu as fini, tu supprime le sprite et l'espace alloué, exemple :
Code : Tout sélectionner
; alloue
*Anim = AllocateMemory(SizeOf(AnimSprite))
CreateAnimSprite(*Anim, #Sprite, TX, TY)
; free
FreeSprite(#Sprite)
FreeMemory(*Anim)