3 modules pour vos sprite animator / charactere / Bridge

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

3 modules pour vos sprite animator / charactere / Bridge

Message par microdevweb »

Message Editer le 8/10/2014

Image

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
:arrow: 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
;}----------------------------------------------------------------------------------------------------------------------------------      

Et voici maintenant l'utilisation des modules:

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)
Créez l'animation avec le soft

Image

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)
NB: si le sprite n'a pas été charger avant, la procédure le fera automatiquement

Pour démarrer l'animation

Code : Tout sélectionner

Start(IdAnimation)
Dans la boucle de votre jeu

Code : Tout sélectionner

Animation(IdAnimation)
Les autres fonctions:

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)
Le module Charactere

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)

Le module Bridge pour la gestion de passerelles, ponts virtuelle ou avec sprite

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...
Dernière modification par microdevweb le mer. 08/oct./2014 9:56, modifié 6 fois.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Un module pour vos animations

Message par Kwai chang caine »

Marche....enfin.... rampe, super bien !!! :D
Merci MicroDevWeb 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Un module pour vos animations

Message par microdevweb »

Un petit up pour les nouveautés
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: 3 modules pour vos sprite animator / charactere / Bridge

Message par Ar-S »

ça a l'air top, merci :)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
raven
Messages : 222
Inscription : jeu. 06/janv./2005 15:45

Re: 3 modules pour vos sprite animator / charactere / Bridge

Message par raven »

merci microdevweb
ç'a le fait 8)
Pb5.24 Lts/5.31 Windows 7 64 nvidia 560 ti E8500 8g ram
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: 3 modules pour vos sprite animator / charactere / Bridge

Message par microdevweb »

Petit Up pour la version beta 2
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: 3 modules pour vos sprite animator / charactere / Bridge

Message par Ar-S »

Lien mort.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre