Réaliser un RPG en C avec SDL et FMOD

Un article de MrCool.


Sommaire



[modifier] Avant-propos

Schéma de gestion des sprites

Le but de cette page est d'arriver, étape par étape, à réaliser toutes les tâches de programmation menant à la conception d'un RPG en 2D.

Le jeu sera écrit en C et utilisera deux librairies:

  • SDL pour l'affichage
  • FMOD pour l'audio (musique et son)

Le rendu final du jeu sera proche des jeux Final Fantasy sur SNES. Tous les mécanismes de base seront implémentés, cependant l'accent ne sera pas mis sur la création d'un gameplay permettant au jeu d'être intéressant. Par exemple, le système de magie pourra gérer plusieurs dizaines de magies mais seulement deux ou trois seront fournies avec les démos. Libre à vous de développer la jouabilité de ce noyau de jeu afin d'arriver à vos fins.


De plus, le code source fourni tente de rester le plus simple possible. Les solutions les plus complexes et les plus optimisées seront implémentées à la fin de la série dans des étapes spéciales. Le but est de ne pas exclure dès le départ des lecteurs potentiels par la difficulté du code.


Bonne lecture!

[modifier] Avertissement

Attention!

Toutes les connaissances nécessaires à la conception d'un jeu ne peuvent être acquises en une seule fois. Une connaissance du C est requise pour la bonne compréhension de cet article. Les liens vers d'autres articles du wiki qui sont insérés dans ces pages peuvent vous aider à combler vos lacunes, n'hésitez pas à les consulter.


[modifier] L'évolution du jeu en images


[modifier] Les étapes de la création d'un RPG

[modifier] Etape n°1: Préparation

Dev-C++ sera notre environnement de développement et GCC notre compilateur.
Dev-C++ sera notre environnement de développement et GCC notre compilateur.

Dans cette étape, nous installons Dev-Cpp et installons les bibliothèques que nous allons utiliser pour le jeu.

 

[modifier] Etape n°2: Commençons!

SDL est la bibliothèque vidéo de notre projet
SDL est la bibliothèque vidéo de notre projet

Il faut désormais poser les bases du jeu: écrire la fonction Main(), initialiser les bibliothèques, lier les fichiers nécessaires au projet.


 

[modifier] Etape n°3: Les cartes

Démo 1: Génération et affichage d'une carte
Démo 1: Génération et affichage d'une carte

La réalisation des décors est un point important du développement du jeu afin d'obtenir un rendu visuel intéressant au final.


 

[modifier] Etape n°4: L'éditeur de carte

Démo 2: L'éditeur de carte de notre jeu
Démo 2: L'éditeur de carte de notre jeu

L'éditeur de carte va nous permettre de créer des cartes complexes à utiliser dans notre jeu.


 

[modifier] Etape n°5: Les sprites et les collisions

Exemple de planche de sprite
Exemple de planche de sprite

La gestion des sprites permet à notre héros d'apparaître. On peut d'ores et déjà le déplacer à l'aide des touches directionnelles et il ne traverse pas les obstables (murs, caisses, etc.).


 

[modifier] Etape n°6: Les événements et les PNJ

Démo 4: gestion des événements et des pnj
Démo 4: gestion des événements et des pnj

L'ajout d'un PNJ à notre carte est relativement aisé grâce au système que nous avons conçu durant l'étape 5, mais créer de toute pièce un système gérant toute l'interactivité du jeu est un vrai défi!


 

[modifier] Etape n°7: Interface, inventaire et boutiques

Démo 5: gestion des menus, de l'inventaire et des boutiques
Démo 5: gestion des menus, de l'inventaire et des boutiques

Les fondations de notre jeu sont posées: il est temps de compléter notre jeu avec des fonctionnalités totalement inédites tel que: un menu permettant de gérer notre inventaire et les armes et armues équipées, une boutique et même une auberge.



 

[modifier] Etape n°8: Combats, fondus enchaînés et coffre

Démo 6: des combats, des fondus enchaînés et un coffre
Démo 6: des combats, des fondus enchaînés et un coffre

Dans cet article, nous allons ajouter un système très important pour notre jeu: le système de combat. La gestion des fondus enchaînés est également au rendez-vous. Enfin, nous ferons encore un petit peu évoluer notre système d'événement avec l'implémentation d'un nouveau type d'événement permettant de gérer (entre autre) les coffres.



 

[modifier] Ressources


[modifier] Table des matières

  1. Préparation
    1. Installation de Dev-C++
    2. Installation des bibliothèques
    3. Téléchargement des DLL
    4. Structure du programme
    5. Installation des médias et des DLL
  2. Commençons!
    1. Création d'un projet
    2. Le fichier main.c
    3. Initialisation et libération des bibliothèques
    4. Configurer le projet
  3. Les cartes
    1. Création du fichier map.c et map.h
    2. Le type struct s_map
    3. Initialisation et libération de la structure
    4. Génération d'une carte aléatoire
    5. Affichage d'une carte
    6. Sauvegarde d'une carte
    7. Chargement d'une carte
    8. Vers un programme utilisable... la boucle de messages
    9. Démo 1: gestion de la carte avec scrolling
  4. L'éditeur de carte
    1. Scission du projet
    2. Changements dans le type struct t_map
    3. Changements dans InitMap()
    4. Changements dans RandomizeMap()
    5. Changements dans HandleMap()
    6. Changements dans HandleEvent()
    7. Changements dans Main()
    8. Ce que sait faire et ne sait pas faire notre éditeur de carte
    9. Démo 2: l'éditeur de cartes
  5. Les sprites et les collisions
    1. Les sprites
    2. Gestion des collisions
    3. Création des fichiers sprite.c et sprite.h
    4. Implémentation des types
    5. Initialisation et libération des sprites
    6. Chargement statique de données
    7. Sauvegarde des sprites
    8. Chargement des sprites
    9. Affichage des sprites
    10. Changer l'animation d'un sprite
    11. Déplacement d'un sprite et gestion des collisions
    12. Gestion des événements
    13. Modification de la fonction Main()
    14. Démo 3: Sprites et collision
  6. Les événements et les PNJ
    1. Ajouter un PNJ
    2. Gestion du déplacement des PNJ
    3. Le sytème de gestion des événements
    4. Création des fichiers events.c et events.h
    5. Implémentation des types de donnée nécessaires
    6. Initialisation et libération de la structure
    7. Chargement des données statiques
    8. Gestion des événements
      1. Programmation de chaque événement
      2. Gestion des déclenchements
    9. Sauvegarde des événements
    10. Chargement des événements
    11. Création de nouveaux événements
    12. Modifications de la fonction main()
    13. Démo 4: PNJ et événements
  7. Interface, inventaire et boutiques
    1. Rpg2d Generator: un générateur de fichiers .map, .sprite et .event
      1. Conception de l'outil
      2. Comment utiliser cet outil?
    2. La gestion des joueurs
      1. Ajout des fichiers player.c et player.h
      2. Gestion des statistiques des joueurs et de l'inventaire
      3. Initialisation et libération des joueurs
      4. Action associée à chaque objet
    3. L'interface graphique
      1. Installation de SDL_TTF
      2. Ajout des fichiers gui.c et gui.h
      3. La structure s_gui
      4. Afficher un dialogue
      5. Afficher un choix
    4. Le menu
      1. Ecran principal
      2. Affichage de l'inventaire
      3. L'équipement
    5. Modification des événements
      1. Ajout de nos nouveaux événements
      2. L'événement dialog
      3. L'événement shop
      4. L'événement inn
    6. Modification de la fonction main.c
    7. De la différence entre les événements SDL_KEYUP et SDL_KEYDOWN
    8. Démo 5: Menus, inventaire et boutiques
  8. Combats, fondus enchaînés et coffre
    1. Fondus enchaînés
    2. Coffre
      1. Ajout d'un nouvel événement
      2. Conception du coffre (carte et événement)
    3. Game Over
    4. Système de combat tour par tour
    5. Principe général
      1. Ajout des fichiers fight.c et fight.h
      2. Gestion des attaques
      3. Gestion des monstres
      4. Affichage des animations
      5. Affichage des dégâts
      6. Affichage des joueurs et des monstres
      7. Réaliser la fonction gérant le combat
      8. Gestion de l'événement associé
    6. Modification de la fonction principale
    7. Note concernant la portabilité
    8. Démo n°6: combats tour par tour, fondus enchaînés et coffre

[modifier] Aller plus loin

[modifier] Travaux dérivés de ce projet

[page de dscussion]Discuter:Réaliser un RPG en C avec SDL et FMOD

Attention!

Un problème, un élément à ajouter, une explication manquante?
n'hésitez pas à le signaler ici!


Sommaire

[modifier] Work In Progress

  • Etape n°8: système de combat et fondus
    • Programmation: 75% [XXXXXXX---] (finitions et débuggage)
    • Article: 0% [----------] (rien...)
  • A venir: une petite conclusion et des améliorations en tout genre, en attente de suggestions ;-)


[modifier] Boîte à idée

  • portage linux?

J'ai recompilé les sources de l'exemple n°7 sous linux avec Anjuta (équivalent linuxien de Dev-c++). Cela fonctionnne bien après quelques adaptations de code.

  • RPG 2D Editeur de carte : ajouter une boîte de dialogue (aide) avec les commandes expliqués et un affichage dès le lancement de l'éditeur.
  • bonus stage: réécrire les entrées/sorties avec flex/bison ou avec lua ?

[modifier] Known issues

[modifier] Segfault lors du changement de carte

events.c l. 153:

event=&GET_EVENT(tx,ty,map,libevent);
 
             while(event)
             {
                if ( (event->onaction==EVENT_ACTION_ONKEYPRESS) && (RND_EVENT_SUCCESS(*event)) )
                   DoEvent(event, libevent, map, libsprite, gui);
                event=event->next;
             }

Il semble que de temps à autres le pointeur next puisse pointer vers des zones mémoires réservées ce qui cause un segfault. Ce bug se produit de temps à autre après le chargement d'une carte.

  • Etat: FIXE (étape 7 mise à jour - retélécharger l'archive à partir du forum si nécessaire)
  • Cause: après le retour de DoEvent, on peut avoir changé de carte entre temps, si c'est le cas, le pointeur event n'est _plus_ valide.
  • Ma solution: provoquer l'interruption du traitement des événéments avec un return. Au prochain tour de la boucle de jeu, les pointeurs seront de nouveaux valides!


[modifier] Questions, problèmes? Discutons-en...

[modifier] Portage rpg 2d

Je suis intéressé par le portage des démos associées aux tutoriaux. Cf le thread suivant: thread sur le forum. --MrCool 30 jul 2005 à 21:20 (CEST)

[modifier] une erreur trouvée

salut, je suis en train de suivre ce tuto pas a pas mais je suis confronté a un probleme !

j'ai une rreur sur la fonction loadMap();, a cette ligne: map->chipset=malloc((map->n_tile)*sizeof(struct s_chipset));

je code sous codeblocks avec minGW et il me retourne cet erreur: 196|error: invalid conversion from `void*' to `s_chipset*'|

j'avoue avoir un peu de mal en allocation dynamique en c (plus simple en c++ ^^) mais je pense que c'est bon la donc j'voit pas l'erreur

tu peut m'aider s'il te plait ? merci d'avance !


Tu peux rajouter le cast suivant avant ton malloc:

map->chipset = (s_chipset*)malloc((map->n_tile)*sizeof(struct s_chipset));

Pour toute autre question, consulte plutot le forum : http://forum.games-creators.org

NewbiZ



Les commentaires ci-dessus ont été laissés par des visiteurs.
Le gestionnaire du site n’est pas responsable de leur contenu. This site's operators can not take responsibility for the content of such comments.