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
http://www.alldev.be/ALLDEV_WEB/TUTO/An ... 1_0_B2.zip
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...