tuto sprite anim (brouillon + début)

Programmation avancée de jeux en PureBasic

à continuer ?

oué
13
100%
nan
0
Aucun vote
 
Nombre total de votes : 13

Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

tuto sprite anim (brouillon + début)

Message par Dr. Dri »

Le but ca va être de créer une biblio de sprites animés transparente pour l'utilisateur (comme les fonctions PB) et aussi d'aprendre à animer ses sprites... cette version est un code commenté par étape... ca m'a pris environ 1h (c garzul qui me l'a demandé) et bien entendu ce qui a été codé fonctionne (même si c'est pas le top)... C'est incomplet mais y'a quand même un début de gestion d'animations...

à faire :
mettre en page ailleurs que dans un simple post
illustrer
commenter les fonctions d'animation
créer un exemple convaincant
expliquer l'essentiel en gros...

voila le média lié au code
Image

et voila le code qui fait office de brouillon, pas rédigé (ou en out cas à l'arrache) donc faut pas trop faire gaffe ^^

Code : Tout sélectionner

;tuto anim version pas rédigée...
;on commence par des initialisations....

InitSprite()
InitMouse()
OpenWindow(1, 100, 100, 640, 480, #PB_Window_TitleBar|#PB_Window_MinimizeGadget, "test anims")
OpenWindowedScreen(WindowID(), 0, 0, 640, 480, 0, 0, 0)
ReleaseMouse(1)

;on va utiliser un seul sprite pour créer des animations...
;le sprite contient 3 images par ligne et 4 lignes
;on dit que le pitch du buffer est de 3 frames

;numérotation des frames avec l'exemple de alex
;  0  1  2
;  3  4  5
;  6  7  8
;  9 10 11

;aussi l'animation a une vitesse, on va la définir
;par la durée d'affichage d'une frame à l'écran

;chaque animation possède un nombre de frames à jouer
;et on va stocker chaque frame à la suite...

;si on récapitule notre structure anim devrai
;ressembler un peu à ca

Structure buffer
  sprite.l
  pitch.l
  count.l
  width.l
  height.l
EndStructure

Structure animation
  buffer.buffer
  speed.l
  count.l
  list.l
EndStructure

;sauf que ca on va pas le dire à l'utilisateur
;sinon ca va être lourd pour lui à utiliser
;donc on est gentil on va lui créer des fonctions

Procedure.l CreerAnimation(sprite.l, pitch.l, count.l, width.l, height.l, speed.l)
  
  If pitch<1 Or count<pitch Or width<1 Or height<1 Or speed<1
    ProcedureReturn 0
  EndIf
  
  *ptr.animation = AllocateMemory(SizeOf(animation))
  If *ptr=0 
    ProcedureReturn 0
  EndIf
  
  *ptr\buffer\sprite = sprite
  *ptr\buffer\pitch  = pitch
  *ptr\buffer\count  = count
  *ptr\buffer\width  = width
  *ptr\buffer\height = height
  
  *ptr\speed = speed
  *ptr\count = 0
  *ptr\list  = 0
  
  ProcedureReturn *ptr
  
EndProcedure

;avec cette fonction on crée nos quatres animations
;alex qui marche dans chaque direction

#SPRITE_ALEX = 1
#VITESSE_ALEX = 300 ;ms, c'est une durée... pas vraiment une vitesse
UsePNGImageDecoder()
LoadSprite(#SPRITE_ALEX, "alex.png")

DefType.l alex_haut, alex_droite, alex_bas, alex_gauche

alex_haut   = CreerAnimation(#SPRITE_ALEX, 3, 12, 48, 64, #VITESSE_ALEX)
alex_droite = CreerAnimation(#SPRITE_ALEX, 3, 12, 48, 64, #VITESSE_ALEX)
alex_bas    = CreerAnimation(#SPRITE_ALEX, 3, 12, 48, 64, #VITESSE_ALEX)
alex_gauche = CreerAnimation(#SPRITE_ALEX, 3, 12, 48, 64, #VITESSE_ALEX)

If alex_haut=0 Or alex_droite=0 Or alex_bas=0 Or alex_gauche=0
  MessageRequester("Erreur", "L'animation n'a pas été créée")
  End
EndIf

;super, on a créé nos 4 animations, à partir d'un unique sprite
;mais bon on a pas de quoi jouer une animation, et puis surtout
;comment l'anim devine-t-elle les frames à jouer ?
;bon bah c'est partit pour une nouvelle fonction...

Procedure AjouterImage(*ptr.animation, frame.l)

  If *ptr=0 Or frame<0 Or *ptr\count<0
    ProcedureReturn 0
  EndIf
  
  If *ptr\count=0
  
    *ptr\list = AllocateMemory(SizeOf(long))
    If *ptr\list=0
      ProcedureReturn 0
    EndIf
    
    *ptr\count = 1
    PokeL(*ptr\list, frame)
    
  Else
    
    size.l = *ptr\count*SizeOf(long)
    *new_list.l = AllocateMemory(size+SizeOf(long))
    If *new_list=0
      ProcedureReturn 0
    EndIf
    
    CopyMemory(*ptr\list, *new_list, size)
    FreeMemory(*ptr\list)
    *ptr\list = *new_list
    
    *ptr\count + 1
    PokeL(*ptr\list+size, frame)
    
  EndIf
  
  ProcedureReturn 1
  
EndProcedure

;maintenant on étudie les quatres animations... elles sont découpées
;en 4 mouvements... d'abord la position 'debout' (au milieu), ensuite
;la position 'pied droit' (à gauche), puis on repasse en position 'debout'
;et enfin la dernière on change de pied (à gauche)...
;pour la première animation ca donne les frames : 1, 0, 1, 2

AjouterImage(alex_haut, 1)
AjouterImage(alex_haut, 0)
AjouterImage(alex_haut, 1)
AjouterImage(alex_haut, 2)

AjouterImage(alex_droite, 4)
AjouterImage(alex_droite, 3)
AjouterImage(alex_droite, 4)
AjouterImage(alex_droite, 5)

AjouterImage(alex_bas, 7)
AjouterImage(alex_bas, 6)
AjouterImage(alex_bas, 7)
AjouterImage(alex_bas, 8)

AjouterImage(alex_gauche, 10)
AjouterImage(alex_gauche, 9)
AjouterImage(alex_gauche, 10)
AjouterImage(alex_gauche, 11)

;c'est bien beau mais on ne sait toujours pas comment afficher nos images
;donc encore une fois on va pas laisser l'utilisateur sans outil pour
;afficher son animation... encore une procédure

Procedure AfficherAnimation(*ptr.animation, x.l, y.l, begin.l)
  
  If *ptr=0 Or *ptr\count<1 Or *ptr\buffer\pitch<1 Or IsSprite(*ptr\buffer\sprite)=0
    ProcedureReturn 0
  EndIf
  
  frame.l = (ElapsedMilliseconds()-begin) / *ptr\speed
  If frame<0 Or frame>*ptr\count Or *ptr\buffer\width<1 Or *ptr\buffer\height<1
    ProcedureReturn 0
  EndIf
  
  frame = PeekL(*ptr\list + frame*4)
  xx.l = (frame % *ptr\buffer\pitch) * *ptr\buffer\width
  yy.l = (frame / *ptr\buffer\pitch) * *ptr\buffer\height
  ClipSprite(*ptr\buffer\sprite, xx, yy, *ptr\buffer\width, *ptr\buffer\height)
  DisplayTransparentSprite(*ptr\buffer\sprite, x, y)
  
  ProcedureReturn 1
  
EndProcedure

Procedure BouclerAnimation(*ptr.animation, x.l, y.l, begin.l)
  
  If *ptr=0 Or *ptr\count<1 Or *ptr\buffer\pitch<1 Or IsSprite(*ptr\buffer\sprite)=0
    ProcedureReturn 0
  EndIf
  
  frame.l = (ElapsedMilliseconds()-begin) / *ptr\speed
  frame % *ptr\count
  If frame<0 Or frame>*ptr\count Or *ptr\buffer\width<1 Or *ptr\buffer\height<1
    ProcedureReturn 0
  EndIf
  
  frame = PeekL(*ptr\list + frame*4)
  xx.l = (frame % *ptr\buffer\pitch) * *ptr\buffer\width
  yy.l = (frame / *ptr\buffer\pitch) * *ptr\buffer\height
  ClipSprite(*ptr\buffer\sprite, xx, yy, *ptr\buffer\width, *ptr\buffer\height)
  DisplayTransparentSprite(*ptr\buffer\sprite, x, y)
  
  ProcedureReturn 1
  
EndProcedure

;maintenant on va afficher nos animations... en boucle pour pas se
;casser la tête...

Repeat
  FlipBuffers(0)
  ClearScreen(0, 0, 0)
  
  ;on affiche les anims
  BouclerAnimation(alex_haut, 10, 10, 0)
  BouclerAnimation(alex_droite, 100, 10, 0)
  BouclerAnimation(alex_bas, 10, 100, 0)
  BouclerAnimation(alex_gauche, 100, 100, 0)
  
  ;on affiche le sprite d'origine
  ClipSprite(#SPRITE_ALEX, 0, 0, 288, 256)
  DisplayTransparentSprite(#SPRITE_ALEX, 630-288, 470-256)
  
  event = WindowEvent()
Until event=#PB_Event_CloseWindow
Dri :idea:
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

vide sidéral ^^

deux personnes ont voté oué en plus de moi et pas un seul commentaire sur la source (qui ne constitue pas le tuto mais plus contenu et le cheminement)

pour dl le début du tuto (rédigé noir sur blanc avec des shémas...) c'est par ici... je voudrais savoir si ce qui a été fait est clair...
télécharger

Dri ...:
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Message par Heis Spiter »

J'en avais déjà parlé de ça... Ceci n'est pas une communauté, il n'y a aucun soutien (a part 2/3 exception). On se fout des projets des autres, mais pas des siens. Et après on s'étonne qu'il y en ai qui partent.

Pour retourner dans le sujet : Dri, j'ai pas voté, j'arrive déjà pas a faire un jeu, alors tenter de comprendre un tuto sur comment animer un sprite :roll: Par contre le Lib, je veux bien :D
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Ben moi, j'ai voté Oui, parce que si la prog de jeux ne m'interesse pas plus que ça, ça peut être utile pour les autres.

Maintenant, il faut savoir que Polux fait la même chose sur son site, que ça risque de faire double emploi et que tu vas certainement t'emm..... pour pas grand-chose. :wink:
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

beaucoup de personne sont en vacances (et plus précicément les piliers du forum) donc forcément, peu de votes :roll:

j'avais déjà voté, ton tuto est bien parti, mais nécessite quand même d'avoir de bonne base avec les structures et la mémoire, je trouve.

faudrait demander à Pierre (ou autre) son avis, je pense que vu son niveau avec la 2D, il doit arriver à comprendre ton tuto sans problème et sera plus à même que moi de te dire ce qui manque pour des débutants (vu que moi, ça fait un peu longtemps que j'ai débuté la prog, je saute des difficultés sans les voirs)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

:D Re dri j'ai compri un peu ton tuto et j'ai voté pour car c'est un bon moyen d'apprendre a faire bouger des image merci meme si il ya manque d'explication du code c'est quand meme clair et sa vaut vraiment le coup ""continue"" ps : Heisspiter pourkoi tu ma bloquer sur msn j'ai pas fait expres c'etait un programme fait en visual basic qui envoyer un message de ... a tous mes contact sur msn et c'etait renommer sims .... mais bon c'est pas grave. :)
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

c'est juste que ceux qui ont voté ne s'expriment pas ^^
faut pas aller si loin Heis :?

Donc le gros problème ce sont les prérequis, et ca je le savais
c'est pourquoi je propose le cheminement et le résultat...
le résultat sera différent, d'ailleurs je change un peu le fonctionnement de mes anims parce que j'ai fait des choix que je trouve plus tellement intéressants...

Dri
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ben moi je vais te dire Dri , je trouve que c'est super bien ce que tu fait !!
contrairement a ce que dit heis , il y a des gens qui "profite" mais qui n'on pas forcement le temps et l'envie de voter !!
moi j'ai pas voté !! pourtant j'ai jeter un oeil plus qu'interressé ; le seul truc c'est que les tutos ne m'interresse en general pas, a titre personnel car je sais deja pas mal de truc sur la conception des jeux en 2D (pour pas dire tout !! , :) ) je me suis bouffe de la literature sur le sujet depuis "hebdogiciel" jusqu'a maintenant ,
mais il n'empeche que je trouve super geant que des gens comme Dri et autre soldat oliv et compagnie fassent des choses comme ça !!
pour les debutants et mem pour des gens qui savent faire, car il existe plein de chemins pour arriver au mem resultat , rien que ça, c'est un enseignement permanent !!
le fait est que l'on a pas ecrire une aubade a chaque fois !! :lol:
moi contrairement a l'autre aigris de Heiss (que j'aime bien)
ben je suis persuadé que beaucoup aprecie ce genre d'initiative !!
mais vont pas forcement le claironner sur tout les toits !!
d'ailleurs moi qui me sais savoir presque tout sur le jeux 2D :D
je viens quand mem sur le forum, car j'apprend non pas a faire (quoique) , mais d'autres point de vue !! c'est essentiel pour la comunautée !!
heiss est aigris car il a fait un super projet qui n'interresse que peut de monde , alors je comprend son point de vue , mais il est faussé !!
il existe des tas d'exemple sur le forum qui démontre que lorsqu'un sujet plait , il trouve echo !! (l'editeur de sons de Zapman est le plus flagrant exemple et pourtant c'est pointu !!)
plein d'exemple de librairie on ete faite grace a la participation de la comunautée !! elle existe cette comunauté , et elle marche tres tres bien !! :D

Dri , ne t'affole pas continue ton bonhome de chemin beaucoup te regarde et te suivent dans tes interventions (sur ce forum et ailleurs ! :wink: )
te decourage pas ! le tutos tu le fait aussi pour toi, car cela te force a y reflechir , et donc a apprendre aussi !! de la part de tous j'en suis sur ! merci !!

ps : moi j'ai du mal a me mettre au truc des structures , c'est vrai que l'on peut faire sans !! , mais c'est bien , c'est surement plus "pro" !!

:D

et merci a tous les autres qui suive ce chemin ... ils se reconnaitront !






:D
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

:D Tien tien dobro lol Pour commencer je fais une calculette mode windows ^^ c'eszt bien non ? enfin dri c'est vraiment cool pour l'animation.
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

J'ai voté oui mais c'est vrai que je n'avais rien mis car je n'avais pas trop de temps et d'idées. :oops: . J'aurai quand même pu mettre un message d'encouragement : Continue :D .

Heis : Tu vas l'avoir ton barman pour BC, t'en fais pas, et pis tu veux du monde sur ton chat mais il était limitté à 3 places :D
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Bon je suis entrain de remplir ma mini lib et j'ai une question existentielle ^^

Pour nommer deux fonctions... laquelle choisireriez-vous ?

PlayReverseAnimation
PlayAnimationInReverse

parce que bon on dit "in reverse" pour "à l'envers" et "play reverse" pour jouer à l'envers et y'a comme qui dirait un mot animation qui viens semer le trouble... pas d'anglais depuis le début des grandes vacances (début mai) donc faut me comprendre c'est plus trop ca :p

Dri
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

AnimationReversePlay :jesors:



Bon, PlayAnimationReverse me parait mieux
Dernière modification par Oliv le mer. 18/août/2004 19:52, modifié 2 fois.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Et pourquoi pas ReverseAnimation, tout simplement? :roll:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ou animation_rebour



dobro tu nous bourre !!

bon :jesors:
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Chris a écrit :Et pourquoi pas ReverseAnimation, tout simplement? :roll:
parce qu'il y a play et loop ^^

Dri
Répondre