Puretools : Animsprite

Programmation avancée de jeux en PureBasic
dlolo
Messages : 118
Inscription : ven. 18/févr./2005 16:29

Puretools : Animsprite

Message 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...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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 :)
dlolo
Messages : 118
Inscription : ven. 18/févr./2005 16:29

Message 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:
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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 :)
dlolo
Messages : 118
Inscription : ven. 18/févr./2005 16:29

Message 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:
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message 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)…
dlolo
Messages : 118
Inscription : ven. 18/févr./2005 16:29

Message par dlolo »

ok, merci
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message 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)
dlolo
Messages : 118
Inscription : ven. 18/févr./2005 16:29

Message par dlolo »

ah ouais c'est une idée ça, je vais tester de ce pas... merci
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Message par graph100 »

j'arrive 3 ans apres la guerre :
j'ai un probleme la structure .animsprit n'est pas reconue 8O
quelle version
Répondre