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 :cry: :cry: :cry: :cry: :cry:

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... :wink:

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 8O
quelle version