
J'ai développer un 3 modules pour gérer les animations et le déplacement de vos sprites 2D, ainsi qu'un petit soft pour gérer l'animation
Tout est le pack ICI

Voila le code nécessaire pour obtenir l'exemple ci-dessus
Code : Tout sélectionner
;-*Teste
EnableExplicit
XIncludeFile "Animator.pbi"
XIncludeFile "Bridge.pbi"
XIncludeFile "Caractere.pbi"
;-*Constantes
#MainForm=0
#Player=0
#IdleR=0
#WalkR=1
#IdleL=2
#WalkL=3
#DropR=4
#DropL=5
#JumpR=6
#JumpL=7
#OverDropR=8
#OverDropL=9
;}--------------------------------------------------------------------------------------------------------------------------------
;-*Variables
Global gEvent
;}--------------------------------------------------------------------------------------------------------------------------------
;-* Procédures
;---- InitGame()
Procedure InitGame()
UsePNGImageDecoder()
UseJPEGImageDecoder()
If InitSprite()=0
MessageRequester("Error","The sprite engine is not be initialised...")
End
EndIf
If InitKeyboard()=0
MessageRequester("Error","The keyboard engine is not be initialised...")
End
EndIf
If OpenWindow(#MainForm,0,0,1200,600,"Animator Teste",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)=0
MessageRequester("Error","The Windows engine is not be initialised...")
End
EndIf
If OpenWindowedScreen(WindowID(#MainForm),0,0,1200,600)=0
MessageRequester("Error","The screen engine is not be initialised...")
End
EndIf
EndProcedure
;---- InitBridge()
Procedure InitBridge()
Bridge::Create(0,100,250,100)
Bridge::Create(260,160,750,160)
Bridge::Create(800,280,1200,280)
Bridge::Create(240,350,700,350)
Bridge::Create(550,500,900,500)
Bridge::Create(0,520,500,520)
Bridge::SetDebugMode()
EndProcedure
Procedure InitPlayer()
;-* Charge les animations
Animator::LoadAnimation("PlayerWalkR.ani",128,128)
Animator::LoadAnimation("PlayerIdleR.ani",128,128)
Animator::LoadAnimation("PlayerWalkL.ani",128,128)
Animator::LoadAnimation("PlayerIdleL.ani",128,128)
Animator::LoadAnimation("PlayerDropR.ani",128,128)
Animator::LoadAnimation("PlayerDropL.ani",128,128)
Animator::LoadAnimation("PlayerJumpR.ani",128,128)
Animator::LoadAnimation("PlayerJumpL.ani",128,128)
Animator::LoadAnimation("PalyerOverDropR.ani",128,128)
Animator::LoadAnimation("PalyerOverDropL.ani",128,128)
;} END Charge les animations
;- Création du player
Character::Create(#Player,128,128)
;-* Création des actions
;-------- Action d'attente Droite
Character::AddAction(#Player,#IdleR,#IdleR,0,0,0,#True)
;-------- Action d'attente Gauche
Character::AddAction(#Player,#IdleL,#IdleL,0,0,0,#True)
;-------- Action de marche Droite
Character::AddAction(#Player,#WalkR,#WalkR,1.5,0,#PB_Key_Right,#True,Character::#Right)
;-------------- Accélération marche Droite
Character::AddAcceleration(#Player,#WalkR,200,0,0.4)
Character::AddAcceleration(#Player,#WalkR,600,0.8,0.6)
;-------- Action de marche Gauche
Character::AddAction(#Player,#WalkL,#WalkL,-1.5,0,#PB_Key_Left,#True,Character::#Left)
;-------------- Accélération marche Gauche
Character::AddAcceleration(#Player,#WalkL,200,0.6,0.3)
Character::AddAcceleration(#Player,#WalkL,600,0.8,0.6)
;--------- Action chute Droite
Character::AddAction(#Player,#DropR,#DropR,0,-5,0,#False)
;--------- Action chute Gauche
Character::AddAction(#Player,#DropL,#DropL,0,-5,0,#False)
;--------- Chute Mortel Droite
Character::AddAction(#Player,#OverDropR,#OverDropR,0,0,0,#False)
;--------- Chute Mortel Gauche
Character::AddAction(#Player,#OverDropL,#OverDropL,0,0,0,#False)
;--------- Configuer les repères pour la gravité
Character::SetGravityRepere(#Player,70,60,50,115)
;--------- Action Saut Droit
Character::AddAction(#Player,#JumpR,#JumpR,5.20,3,#PB_Key_Space,#True,Character::#Right)
;--------------- Ajout d'une direction triger
Character::SetDirectionTriger(#Player,#JumpR,Character::#Right)
;--------------- Déclare que l'action est unique (ne peu pas refaire l'action tanque la touche n'est pas relachée et action limitée à un certain temps
Character::SetOneAction(#Player,#JumpR,#True,800,#DropR)
;--------- Action saut Gauche
Character::AddAction(#Player,#JumpL,#JumpL,-5.20,3,#PB_Key_Space,#True,Character::#Left)
;--------------- Ajout d'une direction triger
Character::SetDirectionTriger(#Player,#JumpL,Character::#Left)
;--------------- Déclare que l'action est unique (ne peu pas refaire l'action tanque la touche n'est pas relachée et action limitée à un certain temps
Character::SetOneAction(#Player,#JumpL,#True,800,#DropL)
;} END Création des actions
;-* Initialisation du player
;------------ Direction par défaut
Character::SetDirectionCharacter(#Player,Character::#Right)
;------------ Les limites du jeu
Character::SetMinMax(#Player,0,1100,0,600)
;------------ La position de départ
Character::SetPosition(#Player,5,-100)
;------------ L'action par défaut
Character::SetDefaultAction(#Player,#IdleR)
;------------ Active la gravité
Character::SetGravity(#Player,#True,350,#DropR,#OverDropR,#DropL,#OverDropL)
;------------ Active le mode debug
Character::SetDebugMode(#Player)
;} END Initialisation du player
EndProcedure
;}----------------------------------------------------------------------------------------------------------------------------------
;-*Initialisation
InitGame()
InitPlayer()
InitBridge()
;}--------------------------------------------------------------------------------------------------------------------------------
;-*Boucle principale
Repeat
;-------- 1) Gestion des événement fenêtre
Repeat
gEvent=WindowEvent()
If gEvent=#PB_Event_CloseWindow:End :EndIf
Until gEvent=0
;-------- 2) Inverse les bufer
FlipBuffers()
;-------- 3) Efface l'écran
ClearScreen(RGB(0,0,0))
;-------- 4) Lecture des événement clavier
ExamineKeyboard()
;-------- 5) Dessin des passerelles
Bridge::Display()
;-------- 6) Mise à jour du joueur
Character::Update(#Player)
;-------- 7) Change la direction du joueur
Character::ChangeDefaultAction(#Player,#IdleR,#PB_Key_Right)
Character::ChangeDefaultAction(#Player,#IdleL,#PB_Key_Left)
Until KeyboardPushed(#PB_Key_Escape)
End
;}----------------------------------------------------------------------------------------------------------------------------------
1) L'animation
2 Solutions:
créez l'animation manuellement comme suit
Code : Tout sélectionner
; 1) Créez en premier l'animation avec un identifiant (ex : #WalkR), vous devez préalablement créer le sprite avec toutes les images de vos animation (voir le fichier png joint)
Create(IdAnimation,IdSprite,FrameWith,FrameHeight,FrameDelay,Widht,Height,loopMode.b=#True)
;StartingLine= la ligne à ou vous voulez prendre la première image
;StartingColumn = la colonne à ou vous voulez prendre la première image
;NumberFrame = le nombre d'images à prendre
;FrameDelay= -1 si vous ne voulez pas changer le délais pour cette suite d'image, ou le délais souhaité
AddFrame(IdAnimation,StartingLine,StartingColumn,NumberFrame,FrameDelay=-1)

Lors de la sauvegarde, renseignez le numéro de sprite (ID), et le numéro d'animation (ID) ces derniesr vous servirons par après.
Ensuite dans l'initialisation
Code : Tout sélectionner
;Le fichier créer avec le soft, la largeur et la hauteur
Animator::LoadAnimation("PlayerWalkR.ani",128,128)
Pour démarrer l'animation
Code : Tout sélectionner
Start(IdAnimation)
Code : Tout sélectionner
Animation(IdAnimation)
Code : Tout sélectionner
;Changer le délais de toutes les séquences d' images
SetAnimFrameDelay(IdAnimation,FrameDelay)
;Changer le délais d'une séquence d' images
SetOneFrameDelay(IdAnimation,FrameIndex,FrameDelay)
;Activer ou désactiver l'animation en boucle
SetModeLoop(IdAnimation,loopMode)
;Arrêter l'animation
StopAnimation(IdAnimation,State.b=#True)
;Ajouter un accélération à l'animation
SetAcceleration(IdAnimation,Acceleration.f)
;Détruire / libérer l'animation
FreeAnimation(IdAnimation)FreeAnimation(IdAnimation)
;Retourne le délais de l'animation en général
GetAnimFrameDelay(IdAnimation)
;Retourne la frame en cours
GetCurrentFrame(IdAnimation)
;Retourne le mode en boucle ou pas
GetModeLoop(IdAnimation)
;Retourne si l'animation est stoppée ou pas
GetAnimationState(IdAnimation)
;Retourne l'ID du sprite
GetIdSprite(IdAnimation)
Code : Tout sélectionner
;Création d'un personnage (ex #Player)
Create(IdCaractere,Width,Height)
;IdCaractere =ID pesonnage
;IdAction = l'action (ex: #WalkR)
;IdAnimation = l'id de l'animation créer précédemment (voir ci dessus)
;VelocityX = le déplacement en X quant l'action est exécutée (positif ou négatif)
;VelocityY = le déplacement en Y quant l'action est exécutée (positif ou négatif)
;KeyboardCommand = la touche du clavier qui déclenche l'action (ex: #PB_Key_Right)
;LoopOn = action en boucle ou pas
;sens de la direction dans le jeu, se renseigne comme suit Character::#Right ou Character::#Left
AddAction(IdCaractere,IdAction,IdAnimation,VelocityX,VelocityY,KeyboardCommand,LoopOn.b=#True,Direction=#Right)
;Ajout du besoins d'une touche supplémentaire pour enclencher l'action
AddKeyBoardAction(IdCaractere,IdAction,KeyboardCommand)
;Ajouter un accélération
ShutterDelay = le délais avant que l'accélération soit effectuée
PercentageAcceleration = le pourcentage de l'accélération (ex: 0.3) pour 30%
DirectionY=#True si l'accélaration doit se faire sur les Y
AddAcceleration(IdCaractere,IdAction,ShutterDelay,PercentageAcceleration.f,PercentageAccelerationAnimation.f=0,DirectionY.b=#False)
;Place le personnage dans le jeux
SetPosition(IdCaractere,PosX,PosY)
;Défini une action par défaut quant aucune toute n'est en foncée (ex : Idle)
SetDefaultAction(IdCaractere,IdAction)
;Défini les zones ou le personnage est bloqué
SetMinMax(IdCaractere,MinX,MaxX,MinY,MaxY)
;Change l'action par défaut suite à la pression d'une touche, à utiliser dans la boucle
ChangeDefaultAction(IdCaractere,IdAction,KeyboardCommand)
;Changer l'animation d'une action
ChangeActionAnimation(IdCaractere,IdAction,IdAnimation,KeyboardCommand)
;Changer la vélocité d'une action
ChangeActionVelocity(IdCaractere,IdAction,VelocityX,VelocityY,KeyboardCommand)
;Défini des marges pour la justesse du repérage
SetMargin(IdCaractere,MarginXL,MarginXR,MarginYU,MarginYD)
;A placer dans la boucle du jeux
Update(IdCaractere)
;Ajoute une gravité au personnage (vous utiliser le module bridge voir ci dessous)
;GravityOn= Actif ou inactif
;MaxDrop = pas encore actif
;IdDropActionR = L'action quant le personnage chute vers la droite
;IdOverDropActionR =L'action quant le personnage chute vers la droite de trop haut (chute mortel)
;IdDropActionR = Idem vers la gauche
;IdOverDropActionR = Idem vers la gauche
;Nb l'action définie pour la chute doit avoir un vélocité négative
SetGravity(IdCaractere,GravityOn.b=#True,MaxDrop=-1,IdDropActionR=-1,IdOverDropActionR=-1,IdDropActionL=-1,IdOverDropActionL=-1)
;Les repères pour la gravité
SetGravityRepere(IdCaractere,GravityXleft,GravityXright,GravityYup,GravityYdown)
;Active ou désactive le cadre de débogage du charactère
SetDebugMode(IdCaractere,State.b=#True,ColorBox=$00FF00,ColorMargin=$008CFF)
;Permet de ne démarrer l'action que dans une direction déterminée
SetDirectionTriger(IdCaractere,IdAction,DirectionTriger)
; Rendre une action unique (qui ne poursuit pas même si l'utilisateur maintient la touche) et qui dure un temps détérminé
SetOneAction(IdCaractere,IdAction,State.b=#True,LiveTime=0,IdActionAfter=-1)
Code : Tout sélectionner
X1,Y1,X2,Y2 = position dans le jeu
Wall.b=#False,IdSprite=-1,Widht=0,Height=0= pas encore implémenté
Create(X1,Y1,X2,Y2,Wall.b=#False,IdSprite=-1,Widht=0,Height=0)
;Active une colorisation des passerelle
SetDebugMode(DebugMode.b=#True,Color=$00FF00,ColorSelect=$FF00FF)
;Affiche les passerelle (doit être placer dans la boucle)
Display()
; Teste si une paserelle est en dessous et retourne la distance entre les deux (et utiliser par Charactere)
TestBridgeDown(X,Y)
Voila reste encore du travaille...