Page 1 sur 1
Puretools : Animsprite
Publié : ven. 25/févr./2005 11:05
par dlolo
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...
Publié : ven. 25/févr./2005 19:16
par comtois
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

Publié : ven. 25/févr./2005 20:45
par dlolo
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

Publié : ven. 25/févr./2005 21:08
par comtois
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 juste une Procédure , si tu ne l'appelles pas , il ne se passe rien !
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
c'est extrait d"un code que tu peux trouver
Ici ( c'est un essai de jeu de plateforme que j'avais fait)
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
à mon avis la lib ne doit pas faire les choses tellement différemment ?
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

Publié : ven. 25/févr./2005 21:16
par dlolo
Oui merci, j'avais déjà vu ton essai de plate forme, je vais essayer d'intégrer ta procedure... maintenant que j'ai la permission...

Publié : ven. 25/févr./2005 22:40
par Dräc
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)…
Publié : ven. 25/févr./2005 23:26
par dlolo
ok, merci
Publié : sam. 26/févr./2005 7:50
par cederavic
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)
Publié : sam. 26/févr./2005 10:32
par dlolo
ah ouais c'est une idée ça, je vais tester de ce pas... merci
Publié : dim. 26/juin/2005 21:22
par graph100
j'arrive 3 ans apres la guerre :
j'ai un probleme la structure .animsprit n'est pas reconue
quelle version