Je viens vers vous car j'ai un intérêt certain pour la programmation. Ayant testé (en restant au niveau de grand débutant malheureusement) divers langage (C, Python) je suis tombé un peu par hasard sur PureBasic. En voyant ici et là sur les forums le bien que les différents utilisateurs en disait, je me suis dit que ça pouvait être un bon choix, mes critères étant simplicité d'apprentissage et puissance du langage. Sur les quelques exemples que j'ai vu, tout ça semble être réunis dans PureBasic. Du coup, je me suis décidé à l'acheter et à rentrer petit à petit dans le vif du sujet.
Désolé pour la petite présentation, j'en viens à mon problème.
Voilà je suis du mieux que je peux le tuto "premiers pas avec purebasic" qui se trouve sur le site de games creators network, qui est dans l'ensemble bien expliqué et simple à suivre. Malgrès tout je me suis confronté à un souci quand j'ai voulu modifier le code d'animation du sprite.
Ce que je voulais arriver à faire c'est d'animer un sprite se dirigeant vers la droite.
Je vous montre le code modifié (enfin très legerement)
Code : Tout sélectionner
;Déclare les procédures
Declare GestionClavier()
Declare AnimationSprite()
Declare DeplaceSprite()
Declare AfficheTexte()
Structure s_Sprite
Direction.l ; Direction de l'animation , Haut droite bas ou gauche
ImageEnCours.l ; Indique quelle image de l'animation est actuellement en cours
ImageMaxi.l ; Nombre d'image maxi pour une animation , ici on a 3 images par direction
TailleX.l ; Dimension en X de chaque image
TailleY.l ; Dimension en Y de chaque image
TempsEnCours.l ; Indique la durée d'affichage de l'image en cours
TempsMaxi.l ; Indique la durée maxi d'affichage d'une image avant de passer à la suivante
x.l ; Position en X du sprite
y.l ; Position en Y du sprite
PasX.l ; Vitesse déplacement en X
PasY.l ; Vitesse déplacement en Y
EndStructure
;Déclare 4 constantes
Enumeration
#AnimeDroite
EndEnumeration
;On déclare un personnage
Global Gus.s_Sprite
Gus\Direction = #AnimeDroite ; On choisit une direction
Gus\ImageMaxi = 4 ;******** (0,1,2,3,4) ce qui fait bien 5 images*********
Gus\ImageEnCours = 0 ; On se place sur la première image de l'animation
Gus\TailleX = 32 ;********* Taille d'une image*********
Gus\TailleY = 40 ;********* Taille d'une image*********
Gus\TempsEnCours = ElapsedMilliseconds() ; Initialise la durée d'affichage de l'ImageEnCours
Gus\TempsMaxi = 150 ; Ajuster la vitesse de l'animation ici
Gus\x = 200 ; Position à l'écran en X
Gus\y = 200 ; Position à l'écran en Y
;Initialise l'environnement nécessaire au fonctionnement des sprites et pour ouvrir un écran.
InitSprite()
;Initialise l'environnement propre à la gestion du clavier.
InitKeyboard()
;Ouvre un nouvel écran avec les caractéristiques Largeur, Hauteur et Profondeur.
OpenScreen(640,480,32,"Tut Sprite")
;Active le support du format PNG (Portable Network Graphic)
UsePNGImageDecoder()
;Charge en mémoire le sprite
If LoadSprite(0,"C:\Users\jeffranso\Documents\DATA\Prog\PUREbasic\sprites\chuck\marcheChuck2.png")=0 ;*****sprite se trouvant sur mon disque dur*****
MessageRequester("Erreur","Impossible de charger le sprite Player.png",0)
End ; Quitte le programme
EndIf
Repeat
;Inverse le buffer d'arrière plan avec le buffer visible à l'écran.
;La partie invisible du buffer remplace alors complètement La partie visible.
FlipBuffers()
;Efface l'écran courant avec la couleur specifiée.
ClearScreen(RGB(0,0,0))
;Gestion du clavier
GestionClavier()
;Affiche un texte à l'écran
AfficheTexte()
;Anime le sprite
AnimationSprite()
;Deplace et affiche le sprite
DeplaceSprite()
Until KeyboardPushed(#PB_Key_Escape)
End
Procedure AfficheTexte()
StartDrawing(ScreenOutput())
FrontColor(RGB(255,255,0))
BackColor(RGB(0,0,255))
DrawText(0,0,"Appuyez sur la touche [Echap] pour quitter")
StopDrawing()
EndProcedure
Procedure GestionClavier()
If ExamineKeyboard()
;La touche haut du curseur est appuyée
;La touche droite du curseur est appuyée
If KeyboardPushed(#PB_Key_Right)
Gus\Direction=#AnimeDroite
Gus\PasX = 1
EndIf
EndIf
EndProcedure
Procedure AnimationSprite()
;Test si la durée maxi d'affichage d'une image est dépassée
If ElapsedMilliseconds()-Gus\TempsEnCours>Gus\TempsMaxi
;Initialise la durée d'affichage
Gus\TempsEnCours=ElapsedMilliseconds()
;Incrémente l'image en cours, pour afficher l'image suivante.
Gus\ImageEnCours + 1
;On reboucle l'animation ici
If Gus\ImageEnCours>Gus\ImageMaxi
Gus\ImageEnCours = 0
EndIf
EndIf
ClipSprite(0,Gus\ImageEnCours * Gus\TailleX, Gus\Direction * Gus\TailleY, Gus\TailleX , Gus\TailleY)
EndProcedure
Procedure DeplaceSprite()
Gus\x + Gus\PasX ; Ajoute le pas en X à la position courante du sprite
Gus\y + Gus\PasY ; Ajoute le pas en Y à la position courante du sprite
Gus\PasX = 0 ; Initialise le pas , il faudra appuyer à nouveau sur une touche pour l'activer
Gus\PasY = 0 ; Initialise le pas , il faudra appuyer à nouveau sur une touche pour l'activer
;Affiche le sprite à la nouvelle position
DisplayTransparentSprite(0,Gus\x, Gus\y)
EndProcedure
Code : Tout sélectionner
Gus\ImageMaxi = 4 ;******** (0,1,2,3,4) ce qui fait bien 5 images*********
Code : Tout sélectionner
Gus\TailleX = 32 ;********* Taille d'une image*********
Gus\TailleY = 40 ;********* Taille d'une image*********
Code : Tout sélectionner
If LoadSprite(0,"C:\Users\jeffranso\Documents\DATA\Prog\PUREbasic\sprites\chuck\marcheChuck2.png")=0 ;*****sprite se trouvant sur mon disque dur*****
Dans l'état actuel, la première image de la planche de sprite se déplace bien vers la droite quand j'appuie sur la flèche droite, mais l'animation ne passe jamais sur les images suivantes, et mon sprite clignote c'est assez ignoble à voir

Je vous montre également le sprite en question

Ce que j'aimerai comprendre, c'est pourquoi le code marche niquel avec une planche de sprite horizontale, et ne marche pas avec une planche verticale...
J'ai quand même un peu cherché avant de venir vers vous, car je pense (dites moi si je me trompe) que le souci est au niveau de la fonction "clipsprite", j'ai testé à taton de la modifier, inverser tailleX et tailleY par exemple mais rien n'y fait.
Alors c'est sûr que je pourrais modifier toutes mes planches pour les mettre horizontales, mais bon je prefererais quand même comprendre comment tout ça fonctionne.
D'ordre géneral je trouve l'aide de PureBasic assez bien foutue, mais là, je la trouve un peu légère sur cette fonction, voire même peu claire. Quelques images en exemple, n'aurait pas été du luxe.
Bon ben voilà, je sais ça fait grand débutant, mais je compte quand même sur vous pour éclairer ma lanterne.
Merci d'avance.