CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[SDL] événement instantané

Malysz
Malysz
Niveau 6
09 janvier 2012 à 12:25:19

Bonjour,

Je suis actuellement en train de faire un petit programme :

Un cheval galope. Si l'utilisateur appuie sur espace, le cheval saute.

Pour faire galoper le cheval, j'ai décomposé son galop en, disons, 5 images, qui sont toutes blittées les unes après les autres (et je dis au programme de dormir quelques centièmes de secondes entre chaque image afin que nos yeux aient le temps de voir).

Jusqu'ici ca marche super bien.

Le problème, c'est que si j'appuie sur espace, le cheval saute effectivement, mais je suis obligé d'attendre la fin du cycle des galops.

C'est à dire que si j'appuie sur espace juste après l'image 1, je dois attendre que les 4 autres soient passées, et enfin le cheval saute. Comment pourrais-je faire pour que le programme fasse sauter le cheval "hillico presto".

J'ai essayé avec PollEvent et avec WaitEvent, ca ne change rien. Doit ajouter un WaitEvent entre chaque image? Oo (en fait, j'ai essayé, mais ca n'a pas fonctionné)

Merci beaucoup

caelacanthe
caelacanthe
Niveau 10
09 janvier 2012 à 13:17:35

ça ne dépend pas de SDL et de son système d'événements ça, uniquement du code. :hap:

Malysz
Malysz
Niveau 6
09 janvier 2012 à 13:19:48

Tu ne m'aides pas beaucoup :hap:

Pocolo
Pocolo
Niveau 10
09 janvier 2012 à 13:20:58

Si j'ai bien compris le problème est simplement que tu fais toute l'animation d'un coup alors qu'il faudrait qu'à chaque tour de la boucle principale celle-ci "avance" un peu.

C'est comme si dans un jeu tu as par exemple un rond de diamètre 6 qui doit grossir jusqu'à un diamètre de 500 ( ouais juste comme ça, histoire de ), tu n'aurais pas forcément envie d'écrire un truc comme "while(++rond.diametre < 500);" qui bloquerait tout le reste de ton jeu jusqu'à ce que le rond atteigne la taille voulue mais plutôt un truc comme "if(rond.diametre < 500) rond.diametre++;".

Malysz
Malysz
Niveau 6
09 janvier 2012 à 14:38:29

En fait non, l'animation se passe très bien.

Mon problème est que tout se passe comme si le SDL regardait s'il y avait un nouveau événement que à la première image du galop, et non entre chaque image ===> d'où mon problème que si je veux sauter, le cheval ne saute pas immédiatement, mais uniquement quand il a fini son cycle de galop (qui dure 5 images).

Triple14
Triple14
Niveau 10
10 janvier 2012 à 11:38:53

No idea?

Pseudo supprimé
Pseudo supprimé 10 janvier 2012 à 12:02:36

Va poster ton morceau de code sur un site spécialisé, tu aura plus de réponse.

Qu'est ce que tu veux qu'on te dise sans avoir le moindre morceau de code pour voire ou en le problème. Si tu veux mon avis, ça viens de ta méthode pour animer ton sprite, et de la gestion de tes évènement qui ne dois pas être efficace.

Pocolo
Pocolo
Niveau 10
10 janvier 2012 à 13:18:43

Pour ma part je maintiens ce que j'ai dit.

" En fait non, l'animation se passe très bien. "

Je n'ai jamais dit que ton animation ne se déroulait pas comme tu le voulais, je ne me suis visiblement pas bien fait comprendre.

Il est vrai que voir le code serait plus pratique, cela permettrait d'une part de confirmer ou non ce que je pense et d'expliquer avec du concret.

Aldebran
Aldebran
Niveau 10
10 janvier 2012 à 14:26:19

"Mon problème est que tout se passe comme si le SDL regardait s'il y avait un nouveau événement que à la première image du galop, et non entre chaque image ===> d'où mon problème que si je veux sauter, le cheval ne saute pas immédiatement, mais uniquement quand il a fini son cycle de galop (qui dure 5 images)."

Pocolo a bien décrit l'origine de ton problème.

Tu as une structure du genre :

Tant que le jeu tourne
----Récupérer évènement
----Si évènement = touche espace alors
--------Animation saut
----Sinon
--------Afficher frame n°1 du galop
--------Attendre
--------Afficher frame n°2 du galop
--------Attendre
--------....
----Fin Si

Du coup si l'utilisateur passe dans la section "Sinon", il sera obligé d'attendre la fin de celle-ci avant que l'évènement "touche espace enfoncée" soit déclenchée.

Il faudrait plutôt une structure du genre (grossièrement) :

frameAffichée = 1
Tant que le jeu tourne
----Récupérer évènement
----Si évènement = touche espace alors
--------Animation saut
----Sinon
--------Afficher frame n°{frameAffichée} du galop
--------frameAffichée = (frameAffichée + 1) % Nombre total de frame
----Fin Si

Une autre solution moins propre serait de contrôler régulièrement l'appui de la touche espace après chaque affichage d'une image de ton cheval pour éventuellement changer l'animation qui doit être jouée.

deeplo
deeplo
Niveau 4
05 mars 2012 à 22:48:39

j'ai codé une petite classe sprite qui a cette architecture suivante :

chaque instance de la classe a une propriété "refTime" (temps de référence) qui est le temps à partir duquel l'action du sprite a été prise en compte
Une autre propriété est le "frameTime" (le temps d'affichage d'une image de l'anim) et le nbFrames (le nombre total d'images pour cette animation)

Du coup, il est facile de savoir quelle image afficher à n'importe quel instant t en faisant la différence de temps actuel moins refTime divisé par le frameTime modulo le nbFrames (de mémoire ca devrait coller)

Cette méthode permet d'etre certain que l'animation gardera un rythme régulier (surtout si il y a du 'lag' par exemple a cause d'un trop gros calcul dans la boucle principale du jeu)

Et si bien sur on appuie sur la touche avant la fin de l'anim, on remet le refTime à jour avec le temps actuel et donc hop, on réaffiche la premiere image a nouveau

voila pour la méthode que je préconise

Romuald

TheLittleRobear
TheLittleRobear
Niveau 10
06 mars 2012 à 12:54:18

Pour les events : http://www.siteduzero.com/tutoriel-3-145225-simplifier-les-events-avec-sdl.html :coeur:

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware