Depuis quelques mois, je code un jeu en C avec ce que j'ai appris sur ce site. C'est un jeu créé avec la SDL2 et ses extensions.
Pour créer ce jeu, j'ai utilisé/implémenté les choses suivantes :
des listes chaînées : pour les ennemis a l’écran (qui sont en nombre variables), et les tirs du vaisseau/ennemis par exemple...
L’utilisation du module "framerate" de sdl_gfx : en effet un problème que j'ai peu retrouve sur Internet, et qui pourtant arrive a beaucoup de débutants, et que s'il l'on gère le framerate en faisant un simple :
SDL_Delay(1000 / 60); // equivaut a SDL_Delay(16)
ou même un :
while (1)
{
Uint32 begin = SDL_GetTicks();
/* ...afficher ecran, etc */
Uint32 end = SDL_GetTicks();
if (1000 / 60 - (end - begin) > 0)
SDL_Delay(1000 / 60 - (end - begin));
}
au final 1000 / 60 = 16
16 * 60 = 960
Ainsi vous aurez 60 frames en 960 millisecondes, et votre rafraîchissement d’écran se désynchronisera de votre affichage, ce qui peut occasionner des "saccades" graphiques regulieres.
L'utilisation de SDL_Net pour faire en mode en reseau/LAN (j'ai été oblige de mettre un peu de variables globales par ci par la, car (spoiler) il y a du multi-treading).
Le multi-threading : pour faire le mode LAN : un thread principal + un thread pour le reseau
L'allocation dynamique : le fameux malloc (mais aussi calloc et realloc) tout un tas d'endroits ou je l'utilise pour diverses raisons.
des vecteurs : quand je charge un des niveau, j'ai l'equivalent en C++ d'un std::vector d'une struct
des collisions pixel-perfect optimisees : le jeu check d'abord les collisions de maniere aabb, puis s'il y a collision, de maniere pixel-perfect.
etc
Le jeu dispose de :
8 niveaux, jouable seul, a 2 sur le meme PC, ou a 2 sur deux PC differents (en LAN).
un support manette
un menu de pause en niveau
6 résolutions d’écran sont possible (allant de HD a 4K)
un boss a chaque fin de niveau
un fond étoilé dynamique
un système de sauvegarde
Vous choisissez la difficulté de chaque niveau (facile, dur, ou très dur).
Vous choisissez votre arme parmi les 3 différentes.
il y a des power-up en niveau (vie en plus, bouclier, double-missile, etc...)
vous disposez des bombes qui detruisent tous les ennemis a l'ecran.
Par contre je ne penses pas que la SDL soit un très bon choix car elle est extrêmement dur pour faire une application propre d'un point de vue technique.
J'ai trouvé un petit bug qui peut être assez ennuyant : Le mouvement diagonal haut-gauche ne fonctionne pas lors du tir
Enfin un support du ZQSD (ou WASD) serait sympathique car mon PC (et surement bien d'autres) n'ont pas de touches directionnelles descentes
Pour le bug, il est possible que ce soit ton clavier (surement d'ordi portable) qui ne supporte pas l'appui sur 3 touches simultanément... Aucune solution à ce problème du coup.
Sinon, merci pour ton feedback, je ferai en sorte qu'on puisse changer les touches pour se déplacer.
Pour le bug, il est possible que ce soit ton clavier (surement d'ordi portable) qui ne supporte pas l'appui sur 3 touches simultanément... Aucune solution à ce problème du coup.
Non ce n'est pas un problème de nombre de touches car il fonctionne très bien avec les autres diagonales.
"Par contre je ne penses pas que la SDL soit un très bon choix car elle est extrêmement dur pour faire une application propre d'un point de vue technique" Pas plus qu'une autre lib, j'utilise la SDL pour mes jeux aussi, il faut juste se dire qsue la SDL est plus une lib "bas niveau" et donc qu'il faut construire un peu derrière pour que avoir un moteur correct
"
Peux-tu expliquer un peu plus le fonctionnement du framerate ?
Pourquoi 60 ? (je suppose que c'est à cause d'un affichage 60Hz)
Mais pourquoi 1000 ?" Je vais répondre à sa place , 1000 pour 1000ms soit 1 seconde , donc 1000/60 donc 16ms qui donne bien le delay attendu pour avoir 60 FPS.
Par contre son code de freamerate peut être mieux pensé pour rentrer dans une fonction , au lieu d'avoir du code dans son gameloop
- Edité par HelbaSama 23 septembre 2020 à 16:08:06
Pour le bug, il est possible que ce soit ton clavier (surement d'ordi portable) qui ne supporte pas l'appui sur 3 touches simultanément... Aucune solution à ce problème du coup.
Non ce n'est pas un problème de nombre de touches car il fonctionne très bien avec les autres diagonales.
Ok, je vais vérifier mais sur mon PC toutes les diagonales fonctionnent...
HelbaSama a écrit:
Peux-tu expliquer un peu plus le fonctionnement du framerate ?
Pourquoi 60 ? (je suppose que c'est à cause d'un affichage 60Hz)
Mais pourquoi 1000 ?" Je vais répondre à sa place , 1000 pour 1000ms soit 1 seconde , donc 1000/60 donc 16ms qui donne bien le delay attendu pour avoir 60 FPS.
Par contre son code de freamerate peut être mieux pensé pour rentrer dans une fonction , au lieu d'avoir du code dans son gameloop
Ah, OK j'ai compris mais est-ce vraiment visible si le framerate est très différent de l'affichage (sur mes applications je n'ai jamais vu de saccades) ?
Est-ce que sdl_gfx permet vraiment une réelle synchronisation ?
Ah, OK j'ai compris mais est-ce vraiment visible si le framerate est très différent de l'affichage (sur mes applications je n'ai jamais vu de saccades) ?
Est-ce que sdl_gfx permet vraiment une réelle synchronisation ?
Il peut se produire ce qu'on appelle du tearing : on affiche une partie de l'image suivante mais pas tout :3
Ah, OK j'ai compris mais est-ce vraiment visible si le framerate est très différent de l'affichage (sur mes applications je n'ai jamais vu de saccades) ?
Si 1000.0 / framerate = un nombre entier, alors ca n'y change rien.
Exemple : 50 FPS
1000.0 / 50.0 = 20
dans ce cas la tu ne verras certainement aucune différence
Mais bon vu qu'on est souvent en 60 FPS...
BrigitteLPB a écrit:
picosoft a écrit:
Ah, OK j'ai compris mais est-ce vraiment visible si le framerate est très différent de l'affichage (sur mes applications je n'ai jamais vu de saccades) ?
Est-ce que sdl_gfx permet vraiment une réelle synchronisation ?
Il peut se produire ce qu'on appelle du tearing : on affiche une partie de l'image suivante mais pas tout :3
Le tearing, c'est autre chose : pour le regler il faut activer la V-sync (possible avec la SDL2)
La c'est un effet de saccade que j'ai ressenti (une frame qui dure plus longtemps que les autres)
EDIT :
J'ai fait une vidéo pour que vous puissiez voir la différence (malheureusement elle n'est qu'en 30 FPS mais on voit quand même...)
Bah je ne vois pas la différence (du coup il est possible qu'il y ait des imperfections chez moi) : je travaille en général avec 50FPS et je ne sais même pas quelle la fréquence d'affichage de mon PC !
Si tu utilises la synchro verticale de la SDL2, alors ta gestion de framerate ne sert plus à rien. Au pire, elle peut être utile uniquement pour éviter que le jeu ne s'emballe sur les moniteurs 100+ Hz.
d'ou la désynchronisation" Cela n'a rien n'a voir avec la langage C cela dit.
Techniquement si tu es a 16 ms /frame , alors tu es à 62,5 FPS Personnellement j’arrondis cela à 17 ms ,vu que la plupart des écrans sont à 60 FPS (et donc d'afficher 58,8 FPS).
Cette MAJ est axee sur le jeu en reseau. Je synchronise maintenant le lancement de la mission chez le serveur avec celui chez le client, en fonction de la latence...
Petit up histoire de dire que j'ai mis à jour le jeu, si vous touchez des ennemis sans vous faire toucher et sans rater vos tirs, vous gagnez des combos qui vous feront gagner du score.
Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884
Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884
Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884
Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884
Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884
Bonhomme !! | Jeu de plateforme : Prototype.
Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884
Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884
Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884
Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884
Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884
Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884