La gestion du temps dans la SDL
Fermé
Brunot9
Messages postés
6
Date d'inscription
jeudi 23 août 2018
Statut
Membre
Dernière intervention
31 août 2018
-
Modifié le 31 août 2018 à 19:21
Brunot9 - 7 sept. 2018 à 23:31
Brunot9 - 7 sept. 2018 à 23:31
A voir également:
- La gestion du temps dans la SDL
- Blocage agriculteur carte en temps réel - Accueil - Transports & Cartes
- Renommer plusieurs fichiers en même temps - Guide
- Logiciel gestion photo gratuit - Guide
- Combien de temps reste une story sur facebook - Guide
- Logiciel gestion cave à vin gratuit excel - Télécharger - Cuisine & Gastronomie
4 réponses
codeurh24
Messages postés
760
Date d'inscription
samedi 29 mars 2014
Statut
Membre
Dernière intervention
8 septembre 2018
123
1 sept. 2018 à 15:45
1 sept. 2018 à 15:45
Bonjour, a qui parle tu ?
SDL_GetTicks() infuance tout le code parce qu’il contrôle le nombre de rendu avec SDL_RenderPresent(afficheur);
Ton while est donc aussi réguler par SDL_GetTicks() a cause de SDL_Delay();
Tes conditions de déplacement ne devrait pas être dans la condition du temps car ça le rend peu lisible.
La boucle régule déjà le temps, il suffis donc de placer tes conditions de déplacement dans le while.
Pour créer une autre image qui se déplace tu devra créer d'autres variables qui utilise SDL_RenderCopy(afficheur, texture, NULL, &destHomer);
A un moment tu ne pourra plus gérer le code devenu trop grand, tu devra passer par de l'allocation mémoire (tableau dynamique) et simplifier ton code par des fonctions.
SDL_GetTicks() infuance tout le code parce qu’il contrôle le nombre de rendu avec SDL_RenderPresent(afficheur);
Ton while est donc aussi réguler par SDL_GetTicks() a cause de SDL_Delay();
Tes conditions de déplacement ne devrait pas être dans la condition du temps car ça le rend peu lisible.
La boucle régule déjà le temps, il suffis donc de placer tes conditions de déplacement dans le while.
Pour créer une autre image qui se déplace tu devra créer d'autres variables qui utilise SDL_RenderCopy(afficheur, texture, NULL, &destHomer);
A un moment tu ne pourra plus gérer le code devenu trop grand, tu devra passer par de l'allocation mémoire (tableau dynamique) et simplifier ton code par des fonctions.
Bonjour,
Oups désolé.
Tu veux dire que je devrais mettre le
Donc si je met d'autres images qui se déplacent, elles seront aussi influencé par le
Je ne connais pas les timers, mais est ce que ce n'est pas mieux pour gérer le déplacement de plusieurs image ?
Oups désolé.
Tu veux dire que je devrais mettre le
if (versLaDroite)dans
while (SDL_PollEvent(&event))?
Donc si je met d'autres images qui se déplacent, elles seront aussi influencé par le
SDL_GetTicks()même si ils ne sont pas à l'intérieur du
if (tempsActuel - tempsPrecedent > 30), c'est bien ça ?
Je ne connais pas les timers, mais est ce que ce n'est pas mieux pour gérer le déplacement de plusieurs image ?
[Dal]
Messages postés
6203
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
29 janvier 2025
1 098
Modifié le 4 sept. 2018 à 11:48
Modifié le 4 sept. 2018 à 11:48
Salut Brunot9,
Lorsque tu postes un nouveau sujet, tu t'adresses au forum :-)
Ta temporisation est gérée dans ton code :
1- par
2- et par le
C'est cette dernière temporisation qui détermine le nombre de FPS de ton jeu.
Avec ton
Si tu perçois des effets de saccades sur le sprite suivant la souris, cela est simplement dû au fait que tu en rafraîchis l'affichage toutes les 30 ms, ce qui est probablement insuffisant, vu que la souris est déplacée par l'utilisateur plus vite que le déplacement du personnage.
Pour fluidifier cela, et si tu tiens à ce qu'un sprite suive le curseur de ta souris, tu n'as pas d'autre choix que d'accélérer la boucle générale.
Voilà un exemple :
Ce code te montre comment établir le temps de ta boucle générale déterminant ton nombre de FPS, et comment animer des objets à différentes allures (plus lentes ou égales à celle de la boucle générale).
Avec cet exemple, le sprite suivant le curseur de la souris devrait être bien plus fluide. C'est, bien sûr au détriment de la consommation de temps CPU par ton programme.
Le mieux, pour la souris est une gestion par la SDL de celle-ci, et d'utiliser les fonctions de la SDL permettant de changer le curseur de la souris.
C'est plus contraignant, mais tu décharges ton programme de cette tâche, tu simplifies ta boucle générale (tu ne géreras plus que les clics de souris et non les déplacements et affichage, ces derniers étant gérés par la SDL), et tu peux réserver l'utilisation de ressources CPU pour autre chose de plus constructif, ou faire revenir le nombre de FPS à quelque chose de plus lent.
Un exemple figure dans la doc de la SDL ici :
https://wiki.libsdl.org/SDL_CreateCursor
Tu pourrais coder ton "viseur" en tant que curseur de souris de cette même façon.
Le format est en réalité un format XPM, qui est un format de description d'image en ASCII destiné à en faciliter l'intégration dans du code C. Tu peux créer des images en ce format texte avec The Gimp, par exemple.
La largeur de l'image doit être un multiple de 8 et, de mémoire, il y a des limitations de taille et de couleurs. Mais si tu restes en noir en blanc et transparence et 32x32 cela devrait le faire :-)
Dal
N.B. : Comme indiqué précédemment tu peux aussi utiliser les timers, ce qui simplifiera ta boucle générale, ou modulariser en créant des fonctions pour gérer les déplacements des objets plutôt que de tout coder dans la boucle générale.
Lorsque tu postes un nouveau sujet, tu t'adresses au forum :-)
SDL_GetTicks()n'effectue en elle-même aucune temporisation. Elle renvoie juste un Uint32 représentant le nombre de millisecondes écoulées depuis l'initialisation de la SDL : https://wiki.libsdl.org/SDL_GetTicks
Ta temporisation est gérée dans ton code :
1- par
if (tempsActuel - tempsPrecedent > 30)qui te sert, en réalité à gérer la temporisation du déplacement de "Homer",
2- et par le
SDL_Delayqui gère la temporisation de la boucle générale en la ralentissant pour éviter à ton programme de consommer trop de temps de calcul CPU
C'est cette dernière temporisation qui détermine le nombre de FPS de ton jeu.
Avec ton
while (SDL_PollEvent(&event)), par rapport à ce que tu avais avant dans ton post précédent, tu as déjà dû constater une amélioration sensible du déplacement du sprite qui suit la souris, car tu traites tous les événements souris à chaque itération de la boucle.
Si tu perçois des effets de saccades sur le sprite suivant la souris, cela est simplement dû au fait que tu en rafraîchis l'affichage toutes les 30 ms, ce qui est probablement insuffisant, vu que la souris est déplacée par l'utilisateur plus vite que le déplacement du personnage.
Pour fluidifier cela, et si tu tiens à ce qu'un sprite suive le curseur de ta souris, tu n'as pas d'autre choix que d'accélérer la boucle générale.
Voilà un exemple :
/* variables de gestion du temps */ Uint32 tempsActuel = 0; Uint32 tempsPrecedentBoucle = SDL_GetTicks(); Uint32 tempoBoucle = 10; Uint32 tempsPrecedentHomer = 0; Uint32 tempoHomer = 30; Uint32 tempsPrecedentBart = 0; Uint32 tempoBart= 20; while(continuer) { while (SDL_PollEvent(&event)) { switch(event.type) { case SDL_QUIT: continuer = 0; break; case SDL_MOUSEMOTION: destViseur.x = event.motion.x - (viseur->w / 2); destViseur.y = event.motion.y - (viseur->h / 2); break; case SDL_KEYDOWN: switch(event.key.keysym.sym) { case SDLK_ESCAPE: continuer = 0; break; } break; } } Afficher(afficheur, textuTil, table, NOMBRE_BLOCS_LARGEUR, NOMBRE_BLOCS_HAUTEUR); tempsActuel = SDL_GetTicks(); /* homer se déplace toutes les 30 ms */ if (tempsActuel - tempsPrecedentHomer > tempoHomer) { if (versLaDroite) { if (destHomer.x >= 790) { versLaDroite = 0; } else { destHomer.x++; } } else { if (destHomer.x <= 0) { versLaDroite = 1; } else { destHomer.x--; } } tempsPrecedentHomer = tempsActuel; // le temps actuel devient le temps présent } /* Bart se déplace toutes les 20 ms */ if (tempsActuel - tempsPrecedentBart > tempoBart) { /* faire déplacement Bart */ } /* la boucle générale tourne toutes les 10 ms * on ralentit la boucle dans cette limite pour modérer * l'utilisation du CPU, ce ralentissement affecte aussi * l'affichage du sprite suivant la souris, qui sera * mis à jour au plus à ce rythme */ if (tempsActuel - tempsPrecedentBoucle < tempoBoucle) { SDL_Delay(tempoBoucle - (tempsActuel - tempsPrecedentBoucle)); tempsPrecedentBoucle = tempsActuel; } SDL_RenderCopy(afficheur, texture, NULL, &destHomer); // copie de image grâce au SDL_Renderer SDL_RenderCopy(afficheur, textuViseur, NULL, &destViseur); SDL_RenderPresent(afficheur); // Affichage des textures }
Ce code te montre comment établir le temps de ta boucle générale déterminant ton nombre de FPS, et comment animer des objets à différentes allures (plus lentes ou égales à celle de la boucle générale).
Avec cet exemple, le sprite suivant le curseur de la souris devrait être bien plus fluide. C'est, bien sûr au détriment de la consommation de temps CPU par ton programme.
Le mieux, pour la souris est une gestion par la SDL de celle-ci, et d'utiliser les fonctions de la SDL permettant de changer le curseur de la souris.
C'est plus contraignant, mais tu décharges ton programme de cette tâche, tu simplifies ta boucle générale (tu ne géreras plus que les clics de souris et non les déplacements et affichage, ces derniers étant gérés par la SDL), et tu peux réserver l'utilisation de ressources CPU pour autre chose de plus constructif, ou faire revenir le nombre de FPS à quelque chose de plus lent.
Un exemple figure dans la doc de la SDL ici :
https://wiki.libsdl.org/SDL_CreateCursor
Tu pourrais coder ton "viseur" en tant que curseur de souris de cette même façon.
Le format est en réalité un format XPM, qui est un format de description d'image en ASCII destiné à en faciliter l'intégration dans du code C. Tu peux créer des images en ce format texte avec The Gimp, par exemple.
La largeur de l'image doit être un multiple de 8 et, de mémoire, il y a des limitations de taille et de couleurs. Mais si tu restes en noir en blanc et transparence et 32x32 cela devrait le faire :-)
Dal
N.B. : Comme indiqué précédemment tu peux aussi utiliser les timers, ce qui simplifiera ta boucle générale, ou modulariser en créant des fonctions pour gérer les déplacements des objets plutôt que de tout coder dans la boucle générale.
[Dal]
Messages postés
6203
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
29 janvier 2025
1 098
Modifié le 6 sept. 2018 à 13:26
Modifié le 6 sept. 2018 à 13:26
Note que dans le code d'exemple sur https://wiki.libsdl.org/SDL_CreateCursor, le tableau contenant les données de l'image est complété de "0,0" qui est capturé par un sscanf pour initialiser les valeurs de hot_x et hot_y avec (hotspot de la souris).
Si tu procèdes de façon similaire en réutilisant le code d'exemple, j'imagine que, dans ton cas, tu voudras que le hotspot soit au centre de ta cible, et non au coin supérieur gauche (comme c'est le cas avec la pointe de la flèche curseur normal de la souris).
Tu devras alors y mettre "16,16" au lieu de "0,0" si ton image est bien en 32x32.
Si tu procèdes de façon similaire en réutilisant le code d'exemple, j'imagine que, dans ton cas, tu voudras que le hotspot soit au centre de ta cible, et non au coin supérieur gauche (comme c'est le cas avec la pointe de la flèche curseur normal de la souris).
Tu devras alors y mettre "16,16" au lieu de "0,0" si ton image est bien en 32x32.