Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Projet] Jeu de plateforme créé en SDL 2

    14 février 2019 à 1:25:59

    Bonjour,

    Alors voila cela fait maintenant quelques années que je m'amuse à coder des petits jeu en C avec la SDL (par exemple j'ai déjà codé un pong, un casse-brique, un snake, un sokoban, ...). Seulement voila j'avais envie de faire un projet de plus grande envergure et plus difficile aussi. Ainsi, j'en ai conclu que faire un jeu de plateforme était la bonne solution. Ainsi aujourd'hui je vous présente mon projet.

    Mon jeu s'appelle "Kaaris vs Booba". C'est un jeu de plateforme en 2D où l'on contrôle le personnage "Kaaris" et on doit terminer 3 niveaux, pour arriver au boss final "Booba". On peut sauter avec la touche haut et se déplacer vers la gauche ou la droite. Dans les niveaux il peut y avoir (en plus des plateformes de base) :

    • des pentes
    • des trampolines
    • des checkpoints
    • des pièces
    • des plateformes mouvantes
    • des monstres (on peut les tuer en leur sautant desuus)
    • des vies
    • des flacons de parfums (qui donnent 6 secondes d'invincibilité)
    • et d'autres éléments uniquement cosmétiques.
    Voici quelques screenshots :

    Pour créer ce jeu, j'ai utilisé les notions du langage C suivantes (auparavant je ne les utilisait que très peu, et c'était une mauvaise habitude) :

    • les structures : en effet pour ne pas trimballer de variables gobales partout, et pour ne pas avoir de fonctions avec cent paramètres, j'ai décide de créer une structures pour chaque type de données (sons, polices d'écriture, images, ...) 
      Pictures* loadPictures(SDL_Renderer *renderer)
      {
          Pictures *pictures = malloc(sizeof(Pictures));
          if(pictures == NULL)
              exit(EXIT_FAILURE);
      
          pictures->HUDlife = IMG_LoadTexture(renderer, "./data/hud/life.bmp");
          pictures->HUDcoin = IMG_LoadTexture(renderer, "./data/hud/coin.png");
          pictures->gameover = IMG_LoadTexture(renderer, "./data/background/gameover.png");
          pictures->title = IMG_LoadTexture(renderer, "./data/background/title.jpg");
          pictures->explosion = IMG_LoadTexture(renderer, "./data/tilesets/explosion.png");
      
          return pictures;
      }
    • l'allocation dynamique : si vous avez regarder le code ci-dessus, vous pouvez remarquer que, étant donné que je retourne un pointeur/une adresse (et aussi car j'envoie les strcutures en paramètres dans mes fonctions) j'ai donc utiliser des malloc(). Cela permet le fait que par exemple la structure Pictures ne soit pas locale à la fonction loadPictures(), mais aussi que les structures ne soient pas passées par copie à chaque fois que je les envoie en paramètres de mes fonctions. J'ai également utilisé l'allocation dynamique dans le chargement de mes niveaux : en effet, la taille d'un niveau est variable. 
      fscanf(file, "width=%d\nheight=%d", &lvl->width, &lvl->height);  // Lecture des dimensions du niveau
      
      lvl->map = malloc(sizeof(int*) * lvl->width);
      if(lvl->map == NULL)
          exit(EXIT_FAILURE);
      
      for(int x = 0; x < lvl->width; x++)
      {
          lvl->map[x] = malloc(sizeof(int) * lvl->height);
          if(lvl->map[x] == NULL)
              exit(EXIT_FAILURE);
      }

       
    • les listes chaînées (pour les monstres) : j'ai créé les fichiers list.c et list.h qui contiennent mon implémentation des listes chaînées. Cette implémentation utilise un sentinelle en début de liste (c'est-à-dire un élément qui "ne sert à rien") pour si l'on veuille supprimer le premier monstre de la liste, ça ne change pas l'adresse du premier élément de la liste. Voici la fonction qui initialise la liste/créer le sentinelle : 
      void initMonsterList(MonsterList *monsterList)
      {
          monsterList->next = NULL;
      }
      
      Et celle qui insert un monstre dans la liste (elle l'insert juste après le sentinelle) : 
      void insertMonster(MonsterList *monsterList, MonsterList *monster)
      {
          monster->next = monsterList->next;
          monsterList->next = monster;
      } 

    Pour ce qui est des bibliothèques utilisées, j'ai choisi :

    • SDL2 
    --------> Pour gérer les evenements de la SDL2 j'utilise ma propre strcuture (qui est en fait une version SDL2 de celle du tutoriel de Fvirtman). 
    typedef struct
    {
        char key[SDL_NUM_SCANCODES];
        char quit;
        char repeat;
        char mousebutton[5];
        int mouseX, mouseY;
        int wheelY;
        char text[4];
        Controller controller;
    } Input;
    Comme vous pouvez le voir, il y une structure Controller ! Le jeu est jouable à la manette et il y a j'utilise également la nouvelle API de la SDL2 pour que la manette vibre.
    ---------> Pour la sortie vidéo, j'utilise des textures et un renderer, et non des surfaces, ce qui certes prend plus de place en mémoire vive, mais permet une hausse des performances grâce à l’accélération matérielle.
    • SDL2_image
    J'initalise SDL2_image pour les formats JPG et PNG.
    • SDL2_ttf
    Etant donné que SDL2_ttf ne travaille qu'avec des surfaces, j'ai créé la fonction suivante qui renvoie la texture créée à partie de la surface du texte donné :
    SDL_Texture* RenderTextBlended(SDL_Renderer *renderer, TTF_Font *font, char *str, SDL_Color fg)
    {
        SDL_Surface *surface = TTF_RenderText_Blended(font, str, fg);
        SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, surface);
        SDL_FreeSurface(surface);
    
        return texture;
    }
    • SDL2_mixer (que j'ai préféré à la FMOD que j'utilisait auparavant). En effet, bien que ces fonctionnalités soit plus limités que celle de la FMOD (pas 2 musiques en même temps, etc...) j'ai quand même choisit cette bibliothèque car je n'avais pas besoin des fonctionnalités avancés de la FMOD et car je la trouve plus simple d'utilisation. 
    • SDL2_gfx : pour dessiner un rectangle avec des angles arrondis quand on termine un niveau. En soit j'aurai très bien pu faire sans, mais c'était juste histoire de compiler une bibliothèque moi-même et de l'utiliser...
    • ffmpeg (pour la lecture d'une vidéo en intro du jeu) : j'ai créer un fonction playVideo que j'ai mise dans le fichier video.c ; cette fonction utilise la ffmpeg pour lire la video d'intro stockée en .mp4 et l'afficher à l'écran via la SDL2.

    Pour ceux qui veulent le code en entier voici le github du jeu : https://github.com/MajorZero2/Kaaris-vs-Booba/

    Pour ceux qui veulent seulement tester le jeu : https://gamejolt.com/games/kaaris-vs-booba/390110

    Voila je voulais juste vous présenter ce projet, si vous avez des remarques sur le code, le jeu ou quoi que ce soit d'autre, n'hésitez pas !

    Merci d'avance.

    -
    Edité par Major_Zero 17 février 2019 à 15:20:59

    • Partager sur Facebook
    • Partager sur Twitter

    Testez mes jeux : Kaaris vs BoobaPush Crate ; Bomberman.

      14 février 2019 à 8:02:38

      Ffmpeg ça m'intéresse ! Je me suis souvent demandé comment lire une vidéo en C/C++
      • Partager sur Facebook
      • Partager sur Twitter
        15 février 2019 à 14:29:07

        Salut,

        Si ffmpeg t'intéresse, voici un très bon tutoriel : http://dranger.com/ffmpeg/tutorial01.html

        • Partager sur Facebook
        • Partager sur Twitter

        Testez mes jeux : Kaaris vs BoobaPush Crate ; Bomberman.

          15 février 2019 à 17:23:00

          Félicitations ! ça a l'air d'un projet bien abouti ! :)
          • Partager sur Facebook
          • Partager sur Twitter

          Recueil de codes en C et C++ http://fvirtman.free.fr/recueil/index.html

            16 février 2019 à 0:22:16

            Major_Zero a écrit:

            Salut,

            Si ffmpeg t'intéresse, voici un très bon tutoriel : http://dranger.com/ffmpeg/tutorial01.html


            Merci !
            • Partager sur Facebook
            • Partager sur Twitter
              24 avril 2019 à 16:18:46

              Bonjour,
              Je reposte histoire de dire que les sprites et animations du personnage ont été refaits, mais surtout qu'il y a maintenant un mode MULTIJOUEUR en split screen jouable à 2 !

              • Partager sur Facebook
              • Partager sur Twitter

              Testez mes jeux : Kaaris vs BoobaPush Crate ; Bomberman.

                25 avril 2019 à 12:18:21

                Salut,

                C'est propre. Le moins que l'on puisse dire c'est que tu as bien progressé depuis le temps où faire une simple animation était encore un problème pour toi. Je te tire mon chapeau et t'adresse mes félicitations.

                Au moins tu as bien compris quelque chose que j'ai du mal à mettre en œuvre : finir un projet simple plutôt qu'être trop ambitieux.

                J'ai une petite idée d'où viennent les éléments de la météo, la neige, les feuilles et la pluie ;).

                Aussi, le titre "Kaaris Vs Booba" se prêterait plus à un jeu de baston.

                Bonne continuation.

                • Partager sur Facebook
                • Partager sur Twitter

                Stringman | Jeux de plateforme : Nouvelle Démo.

                  26 avril 2019 à 22:07:06

                  Merci beaucoup @drx !

                  -
                  Edité par Major_Zero 13 mai 2019 à 2:00:50

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Testez mes jeux : Kaaris vs BoobaPush Crate ; Bomberman.

                    13 mai 2019 à 2:00:18

                    Bonjour,

                    Un mode online est maintenant disponible !

                    Merci d'avance pour vos commentaires.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Testez mes jeux : Kaaris vs BoobaPush Crate ; Bomberman.

                    [Projet] Jeu de plateforme créé en SDL 2

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    • Editeur
                    • Markdown