2D sprite animation

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: 2D sprite animation

Message par blendman »

Salut Falsam

Je suis plutôt d'accord avec toi concernant les fonctions d'animation de sprite, mais d'une manière générale, je me demande si Fred ne doit pas se concentrer sur d'autres fonctions qu'on ne peut pas coder soi-même.

Car même si ce serait beaucoup mieux des fonctions natives pour l'animation de sprites, les particules ou la physique (pour le jeu ou pour des applications), on peut faire tout ça tout seul ;).
Par contre, il y a d'autres choses qu'on ne peut pas faire soi-même, comme la gestion de shaders (pour la 2D), dessiner sur un sprite (ou le render to texture pour la 2D), l'ajout de nouveaux gadgets (dockable par exemple, propertie box, etc...) voir l'export vers Android :mrgreen: (comment ça j'insiste ^^).

Concernant les fonctions qu'on peut coder soi-même vous pouvez regarder ici, car je trouve que c'est plutôt bien fait (notamment animation, physique et collision) :
https://www.appgamekit.com/documentatio ... Sprite.htm

L'idéal serait de créer un topic "Jeu 2D", en post-it dans la rubrique "Trucs et astuces" qui regrouperait toutes les fonctions qu'on trouve un peu partout sur les divers forums (animations, physique, collision, etc...).
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: 2D sprite animation

Message par Backup »

elle ne vous plaisent pas mes 2 fonctions ? 8O

@djes , meme si les cellules sont rectangulaire, mes fonctions .... fonctionnent :)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: 2D sprite animation

Message par blendman »

Dobro a écrit :elle ne vous plaisent pas mes 2 fonctions ? 8O
Je viens de tester, elles sont excellentes, merci ;).
Par contre, au lieu d'utiliser un delai = 60, ce serait mieux de régler ça dans la fonction animation (même un fps pour chaque animation, avec un fps de base à 60 par exemple.
Par exemple un fps de 30 irait 2 fois plus vite et un fps de 120 irait 2 fois moins ;).

J'ai essayé ça, mais le fps qui est pris en compte est celui le plus bas, je ne sais pas pourquoi :

Code : Tout sélectionner

;***********************************************
;Titre  :*Sprite Animé
;Auteur  : Dobro
;Date  :11/03/2014
;Heure  :19:54:21
;Version Purebasic :  PureBasic 5.20 LTS (Windows - x86)
;Version de l'editeur :EPB V2.54
; Libairies necessaire : Aucune
;***********************************************

UsePNGImageDecoder()
Declare  LoadSprite2(id.l, file_name.s, taille_x, taille_y, nb_frame_par_line,nbr_ligne)
Declare  Anim_sprite(id.l,num_ligne,x_spr,y_spr, fps=60)


If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
   MessageRequester("Error", "Sprite system can't be initialized", 0)
   End
EndIf

Enumeration 1
   #Bird
EndEnumeration


OpenWindow(0, 0, 0, 800, 600, "2D Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)

If OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)
   ;LoadSprite(1, #PB_Compiler_Home+"examples\sources\data\Geebee2.bmp")
   
   ; je charge la planche de sprite
   taille_x=64 ; la taille des cellule
   taille_y=64; la taille des cellule
   nbr_frame_par_line=4 ; il y a 4 image 64x64 par ligne
   nbr_ligne=4 ; il y a 4 lignes
   File_name.s="bird.png" ; le chemin de la planche
   LoadSprite2(#bird, File_name.s, taille_x, taille_y, nbr_frame_par_line, nbr_ligne)
   
   ;TransparentSpriteColor(#bird, RGB(255, 255, 255))
   
   Repeat
     
      WindowEvent()
      ExamineKeyboard()
      ExamineMouse()
      
      ClearScreen(RGB(0,0,0))

      
      Anim_sprite(#bird,0,100,100, 100) ; ici j'affiche la premiere ligne de la planche
      Anim_sprite(#bird,1,200,100) ; ici j'affiche la Deuxieme ligne de la planche
      Anim_sprite(#bird,2,300,100, 20) ; ici j'affiche la troisieme ligne de la planche
      Anim_sprite(#bird,3,400,100, 35) ; ici j'affiche la 4em ligne de la planche
      
      Delay(1) ; je ralenti car chez moi c'est trop rapide LOL
      FlipBuffers()
      
   Until KeyboardPushed(#PB_Key_Escape)
   
   Else
   MessageRequester("Error", "Can't open a 800*600 - 32 bit screen !", 0)
EndIf

End   

; *************** zone procedure  **********************
Procedure LoadSprite2(id.l, file_name.s, taille_x, taille_y, nbr_frame_par_line,nbr_ligne)
   ; by Dobro
   Structure Spr
      id.l
      x.l
      y.l
      taille_x.l
      taille_y.l
      nbr_frame_par_line.l
      nbr_ligne.l
   EndStructure
   Global Spr.Spr
   
   spr\id.l=id.l
   spr\taille_x.l=taille_x
   spr\taille_y.l=taille_y
   spr\nbr_frame_par_line.l=nbr_frame_par_line
   spr\nbr_ligne.l=nbr_ligne
   
   LoadSprite(id.l,file_name.s,#PB_Sprite_AlphaBlending)
   
EndProcedure

Procedure Anim_sprite(id.l, num_ligne, x_spr, y_spr, fps=60)
  
   ; by Dobro
   Static  x, compteur, fps_max
   
   If fps_max >= fps
     fps_max = 0
     compteur = compteur+1
     x = x + spr\taille_x.l     
   Else
     fps_max = fps_max +1 
   EndIf

   If compteur => spr\nbr_frame_par_line.l
     compteur = 1
     x = 0
   EndIf
   
   y = num_ligne * spr\taille_y.l
   ;ClipSprite(spr\idl,#PB_Default ,#PB_Default ,#PB_Default ,#PB_Default )
   ClipSprite(spr\id.l, x, y, spr\taille_x.l, spr\taille_y.l)
   DisplayTransparentSprite(id.l, x_spr, y_spr)

EndProcedure

; Epb
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: 2D sprite animation

Message par falsam »

Fred a écrit :Pour utiliser la transparence de l'image, il faut mettre le flag "#PB_Sprite_AlphaBlending" lors du chargement, et ca devrait marcher.
Merciiiiii Fred.

@djes: Tu as effectivement raison. En parcourant le net, j'ai constaté qu'il n'y a pas de normalisation dans les planches de sprites. Finalement Pure Basic est plus souple dans la gestion des sprites. Par contre, et la aussi tu as raison, il est nécessaire de coder ses propres routines d'animations.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: 2D sprite animation

Message par Backup »

@Blendman

j'ai migré mon code ici :
http://www.purebasic.fr/french/viewtopi ... =6&t=14289

pour eviter de polluer le topic a Falsam (meme si c'est deja bien fait :mrgreen: )
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: 2D sprite animation

Message par falsam »

Fred a écrit :Pour utiliser la transparence de l'image, il faut mettre le flag "#PB_Sprite_AlphaBlending" lors du chargement, et ca devrait marcher.
Fonctionne parfaitement sous Windows mais pas sous Mac OS.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Fred
Site Admin
Messages : 2648
Inscription : mer. 21/janv./2004 11:03

Re: 2D sprite animation

Message par Fred »

Tu peux poster un code d'exemple dans le forum bug du forum anglais ? Ca devrait marcher.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: 2D sprite animation

Message par falsam »

Fred a écrit :Tu peux poster un code d'exemple dans le forum bug du forum anglais ? Ca devrait marcher.
Je prépare un code miminum et je poste.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre