Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Projet] Jeu créé en C + SDL2

Space War

10 septembre 2020 à 20:12:18

Bonjour,

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.
  • etc

J'aimerai avoir vos avis sur ce jeu si possible.

Lien du jeu : https://gamejolt.com/games/space-war/482884

Le github est dispo ici : https://github.com/gaziduc/space-war

Screens : 

-
Edité par Gaziduc 8 novembre 2020 à 21:41:59

  • Partager sur Facebook
  • Partager sur Twitter

Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884

22 septembre 2020 à 23:34:23

Salut,

petit up histoire de dire que le jeu est dispo sous Mac !

https://gamejolt.com/games/space-war/482884

Bonne soiree.

  • Partager sur Facebook
  • Partager sur Twitter

Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884

Anonyme
23 septembre 2020 à 7:20:21

Salut,

Du sacré taf que tu as fais là ^^.

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 

  • Partager sur Facebook
  • Partager sur Twitter
23 septembre 2020 à 13:12:43

Salut,

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.

  • Partager sur Facebook
  • Partager sur Twitter

Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884

23 septembre 2020 à 14:12:59

Salut Major_Zero,

Je n'ai pas eu le temps de regarder les liens mais félicitations pour ton taf !

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 ?

  • Partager sur Facebook
  • Partager sur Twitter
Architecture SDL                     Multithreading         
Anonyme
23 septembre 2020 à 15:29:49

Major_Zero a écrit:

Salut,

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.
  • Partager sur Facebook
  • Partager sur Twitter
23 septembre 2020 à 16:04:28

"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 :p

-
Edité par HelbaSama 23 septembre 2020 à 16:08:06

  • Partager sur Facebook
  • Partager sur Twitter
23 septembre 2020 à 17:58:16

BrigitteLPB a écrit:

Major_Zero a écrit:

Salut,

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 :p

-
Edité par HelbaSama il y a environ 1 heure

En langage C:

1000/60 = 16

mais

1000.0/60.0 = 16.666667

d'ou la désynchronisation



-
Edité par Gaziduc 23 septembre 2020 à 17:58:45

  • Partager sur Facebook
  • Partager sur Twitter

Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884

23 septembre 2020 à 18:59:28

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 ?

  • Partager sur Facebook
  • Partager sur Twitter
Architecture SDL                     Multithreading         
Anonyme
23 septembre 2020 à 19:55:19

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

  • Partager sur Facebook
  • Partager sur Twitter
23 septembre 2020 à 20:27:42

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) ?


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...)

https://www.youtube.com/watch?v=xkDpMoHkrWk

-
Edité par Gaziduc 23 septembre 2020 à 20:54:29

  • Partager sur Facebook
  • Partager sur Twitter

Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884

23 septembre 2020 à 21:32:45

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 ! :)
  • Partager sur Facebook
  • Partager sur Twitter
Architecture SDL                     Multithreading         
24 septembre 2020 à 9:13:15

Salut,

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.

  • Partager sur Facebook
  • Partager sur Twitter

Bonhomme !! | Jeu de plateforme : Prototype.

24 septembre 2020 à 13:58:27

"

En langage C:

1000/60 = 16

mais

1000.0/60.0 = 16.666667

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).

  • Partager sur Facebook
  • Partager sur Twitter
16 octobre 2020 à 14:15:31

Bonjour,

Petit up histoire de dire que j'ai mis à jour le jeu.

Nouveautés :

  • Ajout d'un support souris en mission
  • le hud affiche maintenant P1 et P2
  • Ajout de la possibilité de changer les touches du clavier
  • Augmentation de la vitesse de certains éléments pour un jeu plus dynamique
  • Refonte de menu de paramètres
  • les ennemis standards tirent maintenant plus souvent
  • Le jeu consomme moins de RAM
  • Correction de beaucoup de bug dans le netcode
  • le niveau 8 a été refait
  • le volume peut maintenant être réglé plus précisément
Jeu disponible ici (Windows, Mac, Linux) : https://gamejolt.com/games/space-war/482884
-



-
Edité par Gaziduc 16 octobre 2020 à 23:27:07

  • Partager sur Facebook
  • Partager sur Twitter

Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884

15 novembre 2020 à 0:43:26

Salut,

Mise a jour 1.9 disponible : https://gamejolt.com/p/space-war-1-9-update-retworking-overhaul-nik6ecvg

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...

Merci d'avance.

  • Partager sur Facebook
  • Partager sur Twitter

Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884

12 décembre 2020 à 2:01:05

Salut,

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.

Voili voilà bonne journée.

  • Partager sur Facebook
  • Partager sur Twitter

Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884

28 décembre 2020 à 18:57:19

Salut,

La mise a jour 1.12 pour Space War est disponible ! https://gamejolt.com/p/update-1-12-trophies-iurbthsu

Elle apporte des defi/trophees a accomplir in-game !

De plus il y a maintenant le support des manettes DualSense et Xbox Series X !

Voila bonne journée !

-
Edité par Gaziduc 28 décembre 2020 à 19:00:27

  • Partager sur Facebook
  • Partager sur Twitter

Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884

15 janvier 2021 à 18:25:50

Salut,

MAJ 1.14 dispo : un tutoriel a ete ajoute

  • Partager sur Facebook
  • Partager sur Twitter

Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884

13 novembre 2022 à 2:40:30

Salut,

Maj 1.21 dispo

Au menu :

le mode de jeu en réseau a été totalement refait.

  • Partager sur Facebook
  • Partager sur Twitter

Mon jeu multi online gratuit : https://gamejolt.com/games/space-war/482884