![Retour au site](templates/subSilver/images/logo.png) |
zeldaroth.fr le site officiel de Zelda ROTH
|
Voir le sujet précédent :: Voir le sujet suivant |
Auteur |
Message |
Gradapin Primé d'or
![Primé d'or Primé d'or](rangs/prime.png) Modérateur
![Modérateur Modérateur](rangs/modero.png) Stalfos
![Stalfos Stalfos](rangs/stalfos.png)
![](http://zeldaroth.fr/avatars/avatar260o.png)
Inscrit le: 15 Juil 2008 Age: 28
Messages: 1708
|
Posté le: Sam Oct 01, 2011 18:46 Sujet du message: Tutoriel : Utilisation du moteur de Zelda ROTH |
|
|
Bonjour à tous.
Ceci est un tutoriel expliquant les bases du moteur de Zelda ROTH pour ceux qui voudraient l'utiliser afin de modifier certaines choses comme des téléportations, des monstres, etc.
ATTENTION: ce tutoriel n'est pas un tutoriel sur le C++ et ne vous apprendera pas non-plus comment modifier tout le moteur, mais juste des éléments qui sont nécessaires à la création d'un éventuel nouveau jeu.
Ceci dit, allons-y !
PARTIE 1: Bien s'équiper pour commencer
La première partie de se tutoriel est simple. Nous allons télécharger les outils dont nous avons besoin pour modifier le jeu.
Tout d'abord, il nous faut un IDE (Integrated Development Environment), cet utilitaire va nous permettre de modifier notre code et surtout, de le compiler pour pouvoir y jouer !
Il existe plusieurs IDE, pourtant je ne vais vous en présenter qu'un seul car le but de ce tutoriel n'est pas de vous apprendre toutes ses fonctions/avantages.
Moi, j'utilise CodeBlocks, c'est un très bon IDE gratuit, vous pouvez le télécharger ici.
Une fois l'IDE télécharger, nous allons avoir besoin de librairies. Une librairie, c'est un ensemble de fonctions déjà conçues qui sont utilisées par le moteur, donc si nous voulons le recompiler nous allons avoir besoin de ces librairies !
Le moteur utilise 4 librairies: SDL, SDL_Image, SDL_GFX et FMOD. Pour vous faciliter la tache, je vous ai fait un dossier qui les contient toutes, c'est ici pour le télécharger.
Bien, maintenant, il nous faut un dernier élément, le plus important: le code du moteur, bien évidemment. Pour cela, vous pouvez télécharger les sources ici !
PARTIE 2: Obtenir une première compilation
Cette partie est très importante, et c'est souvent la plus problématique car il peut survenir de nombreuses erreurs de compilations, donc si vous en avez une particulière et que vous n'arrivez toujours pas à compiler à la fin de cette partie, n'hésitez pas à laisser un commentaire.
Alors, premièrement, installez CodeBlocks si ce n'est pas déjà fait. Ensuite, faites File > New > Project. Dans la liste, séléctionnez SDL project, puis faites Next. Ensuite, il vous demande d'entrer le nom de votre projet et le répertoire de votre ordinateur où sauvegarder votre projet. Les deux derniers champs se remplissent automatiquement, donc faites Next.
Maintenant, il vous demande de lui signaler où se trouve vos librairies. Mais vu qu'elles sont tout en désordre dans le dossier que je vous ai donné, nous allons devoir les ranger. Donc pour l'instant, laissez CodeBlocks où il est puis allez dezipper le dossier Librairies. Allez dans le dossier Include et copiez les deux dossiers. Allez maintenant dans le dossier où vous avez installé CodeBlocks, puis dans MinGW > Include, et copiez les dossiers. Ensuite, retournez dans le dossier Librairies, et allez maintenant dans Lib. Allez dans le dossier FMOD et copiez tous les fichiers. Maintenant allez dans CodeBlocks > MinGW > Lib, et collez les fichiers. Faites de même avec les fichiers du dossier SDL. Une fois tout copié, allez dans CodeBlocks > MinGW > Include > SDL, et copiez SDL.h, collez le dans le dossier Include avec tous les autres fichiers, puis dans le dossier MinGW. Une fois tout ça fait, il nous reste plus qu'à renseigner CodeBlocks où tous les fichiers se trouvent !
Cliquez donc sur ..., CodeBlocks va vous ouvrir une grande fenêtre, mais fermez-là, et il vous en ouvrira une plus petite qui vous demandera de séléctionner un dossier. Séléctionnez le dossier MinGW dans le répertoire où vous avez installé CodeBlocks, puis faites Next. Ensuite, il vous demande de choisir le compiler, donc séléctionnez GNU GCC Compiler et cochez Create "debug" configuration puis Create "release" configuration. Faites finalement Finish, pour créer votre projet !
Votre projet créé, les ennuis ne font que commencer !
Tout d'abord, allez dans le dossier des sources de Zelda ROTH puis dans le dossier SRC, puis copiez tous les fichiers .cpp et .h . Copiez-les à la racine de votre projet. Retournez dans le dossier des sources et copiez le dossier data. Collez-le également à la racine de votre projet.
À gauche, vous devriez voir le nom de votre projet en gras. Effectuez un clic droit dessuis puis cliquez sur Add files. Maintenez la touche CTRL puis séléctionnez tous les fichiers .cpp et .h, puis faites Ouvrir. Il va maintenant vous ouvrir une petite fenêtre, mais ne vous en occupez pas et faites OK.
Maintenant, vous devez lier les librairies externes (les librairies autre que la SDL) à votre projet. Tout d'abord, cliquez sur l'onglet Project puis Properties. Allez dans la partie Build targets, puis à droite vous devriez apercevoir Type: et en face, une liste déroulante. Si GUI application n'est pas séléctionné, alors séléctionnez-le puis faites OK. Ensuite, allez dans Project > Build Options, puis cliquez sur l'onglet Link settings. Maintenant, cliquez sur add, puis recherchez le fichier SDL_image.lib qui devrait se situer dans votre dossier MinGW > Lib. Une fois fait, CodeBlocks vous demande quelque chose, et surtout, cochez Non, puis faites OK. Faites de même pour sdlgfx.lib puis pour libfmod.a. Une fois toutes ces librairies ajoutées, cliquez finalement OK pour fermer la fenêtre.
Vous avez peut-être noté que dans le dossier Librairies > Lib, il y a des fichiers dll. Copiez-les tous, et collez-les à la racine de votre projet. Si vous ne le faites pas, lorsque vous lancerez le jeu, il vous dira que ces dll sont manquantes et vous ne pourrez pas jouer.
Dernière étape: indiquer à CodeBlocks où se trouve le compilateur à utiliser. Pour cela, allez dans Settings > Compiler and debugger, puis dans la partie Toolchain executables, cliquez sur Auto-detect. Si il ne vous détecte rien du tout, alors vous pouvez lui indiquer manuellement en séléctionnant le dossier MinGW.
Bien, une fois toutes ces étapes accomplies, l'heure de vérité approche.
À gauche, il devrait y avoir une icone de roue munie d'une petite flèche avec le label Build and run, une fois trouvée, cliquez dessus !
Patientez. Si beaucoup de phrases écrites en rouge s'affichent dans la petite boite en bas, cela veut dire évidemment que la compilation a échouée, donc pour cela, écrivez-moi leur contenu dans les commentaires pour que je puisse vous aider, sinon, c'est que le jeu va se lancer d'une seconde à l'autre !
PARTIE 3: Let's write some code: Les coffres et objets au sol
Nous nous situons maintenant dans le vif du sujet !
Tout au long de cet article, je vais réaliser en parallèle une mini-aventure, qui sera disponible à la fin du tutoriel.
Dans cette partie, nous allons voir comment sont gérés les objets que nous ramassons au sol, pour pouvoir les changer et également changer leurs positions !
Alors premièrement, sachez que le fichier que nous allons le plus utiliser est Monde.cpp, pour cela, vous pouvez le séléctionner à gauche, si vous ouvrez toutes les listes contenant les fichiers (en dessous du nom de votre projet). Pour le séléctionner, double cliquez dessus !
Imaginons maintenant que je veux changer le coffre où se trouve le bouclier de départ, imaginons que je veux mettre des gants. Pour cela, vu que le fichier est très grand, nous allons utiliser une fonction très pratique: rechercher !
Pour ça, effectuez un CTRL + F pour aller plus vite, et recherchez le mot bouclier (faites attention que certaines options comme la casse ne soient pas activés). Personnellement, la fonction rechercher m'amène à la ligne suivante :
Code: | if (!gpJoueur->getBouclier()) setValeur(15*16, 10*16, 303, 0, PLEIN, C_BOUCLIER); |
Alors tout d'abord, un petit point sur le C++.
Le if est un outil de comparaison qui est très important. À chaque fois que nous avons besoin de faire une comparaison, nous utilisons un if. Ici, le if sert à savoir si le joueur ne possède pas le bouclier (notez le ! qui exprime la négation). La commande qui suit est celle que le programme doit effectuer si la condition est remplie, donc dans ce cas, cela veut dire qu'il met un coffre content un Bouclier.
À la ligne suivante, nous pouvons remarquer une ligne un peu pareil, mais cette fois il a un else. Le else peut se traduire par "sinon", ce qui est donc ce qu'il se passe si la condition n'est PAS remplie. Dans ce cas, ça signifie: Si le joueur possède le bouclier. Et dans ce cas, ça modifie le coffre par un coffre vide qui ne possède aucun objet !
Est-ce plus clair maintenant ?
Bien, maintenant, essayons de le modifier !
Nous pouvons remarquer que dans le code, il y a C_BOUCLIER, (Contenu Bouclier), cela veut dire que nous allons utiliser quelque chose utilisant le préfixe C_. Pour savoir le nom de tous les "objets" utilisés, je vous conseille d'aller regarder dans le fichier Common.h, c'est là que toutes les variables constantes sont définies, donc nous pouvons regarder tous les noms et les remplacer pour voir ce que ça fait !
Tout d'abord, dans ce fichier je peux voir que le mot enum revient souvant. Et bien c'est là que toutes les listes sont définies car le moteur utilise plusieurs listes. Il y a les contenus (les objets qu'on prend dans les coffres), il y a les items, ceux qu'on trouve par terre et encore pleins d'autres. Nous verrons les autres un autre moment, pour l'instant, seuls les contenus nous intéressent. Donc regardons la liste définie par enum Type_contenu. Nous pouvons apercevoir qu'il y a bien C_GANTS. Donc maintenant, retournons dans Monde.cpp et changeons C_Bouclier par C_GANTS, puis compilons !
Ça fonctionne !
En revanche on peut remarquer que si je quitte la map et que je reviens, le coffre sera revenu comme avant. Mais c'est tout à fait normal, nous n'avons pas changé la condition. Donc maintenant, nous allons essayer avec un peu de logique. Vu qu'il y avait marqué !gpJoueur->getBouclier() nous allons essayer en remplaçant par !gpJoueur->getGants(). Compilons et... Ça ne fonctionne pas !
En effet, nous avons essayé au hasard, mais rien ne nous dit que la fonction a été crée. Même si elle existe très probablement, nous ne connaissons pas son nom exact. Pour le savoir, nous allons regarder un nouveau fichier. Vu que nous utilisons gpJoueur, ce que cherchons doit probablement se trouver dans Joueur.h !
Dans les fichiers .h, nous pouvons trouver toutes les déclarations des fonctions sans en avoir le code (le code étant dans les fichiers C++). Cela est pratique, car le code ne nous intéresse pas vraiment, nous voulons seulement rechercher une fonction qui pourrait corriger notre problème. Après avoir attentivement regardé la liste des fonctions, nous pouvons remarquer une fonction nommée hasObjet(int i). Cette fonction est très pratique car elle va nous permettre de savoir si le joueur tient tel objet.
Retournons dans Monde.cpp. Maintenant, nous ne savons toujours pas comment s'utiliser hasObjet. Mais comme nous avons de la chance (cette fonction étant utilisée de nombreuses fois dans Monde.cpp), nous pouvons remarquer quelques lignes plus bas: hasObjet(O_LIVRE). La fonction s'utilise donc avec une liste ayant le préfixe O_. Pour cela, essayons donc en remplaçant gpJoueur->getBouclier() par gpJoueur->hasObjet(O_GANTS), puis compilons !
Miracle, ça marche.
Vu que ce que nous avons fait n'a que peu d'intérêt, je propose qu'on remette le bouclier à la place où il était. Pour cela, faites retour jusqu'à avoir le fichier d'origine (CTRL+Z).
Maintenant, regardons la fonction setValeur qui semble être utilisée beaucoup dans ce fichier. On peut remarquer que dans cette fonction, il y a plusieurs valeurs qui sont entre parenthèses. Celles-ci sont appelées paramètres. Ces paramètres sont séparés par des virgules. Les deux premiers paramètres sont la position de la valeur à changer. Si la position est multipliée par 16, c'est parce que la position est utilisée en pixels. Une case étant 16 pixels, si on veut compter en case (car c'est plus facile), nous n'avons qu'à multiplier par 16. Le premier paramètre est la position horizontale (0 = tout à gauche). Le deuxième paramètre est la position verticale (0 = tout en haut).
Le troisième paramètre, c'est le numéro de la case. Celle-ci est visible dans l'éditeur de map (en bas, là où il y a marqué "Motif:"). Ce numero correspond donc à l'image du coffre dans notre cas. Le paramètre suivant fait référence aux collisions. Dans notre cas, il y a marqué PLEIN, cela équivaut à des collisions rouges dans l'éditeur, ça veut dire que rien ne passe. (Les noms des collisions sont visibles dans le fichier Common.h). Et le dernier paramètre est finalement le contenu de la case (ce qui est donc utilisé pour les coffres).
Maintenant que nous avons vu les coffres, nous allons maintenant nous attaquer aux objets au sol !
Pour cela, nous allons prendre l'exemple de l'épée. Pour ça, nous allons rechercher le mot epee (sans accents, car les accents ne sont pas utilisés en C++ comme dans la plupart des langages).
Bingo, nous avons trouvé la ligne:
Code: | if (!gpJoueur->getEpee()) gpJeu->ajouteObjet(I_EPEE, 50*16, 68*16-8); |
Nous pouvons remarquer que les commandes sont différentes, mais utilisent la même structure. Cette fois, le paramètre servant à signaler l'objet utilisé utilise le préfixe I_. Les paramètres suivant sont donc la positions (le second, x, axe horizontal, et le troisième, y, axe vertical).
Lorsque vous voulez changer les positions, je vous conseille de vous munir de l'éditeur de map pour qui vous signale en bas à gauche la position en cases (donc multiplié par 16), et à droite, la position au pixel près !
ATTENTION : Lorsque vous choisissez de positionner un objet au pixel près, gardez en mémoire que le point de coordonnée que vous avec envoyé à la fonction sera le point en haut à gauche de l'objet utilisé. Donc lorsque vous placez un objet, sâchez sa taille avant pour pouvoir directement choisir la bonne coordonnée.
Maintenant, imaginons que je veux changer l'épée de place. Pour cela, je vais regarder sur l'éditeur où je veux le placer, puis je vais remplacer les valeurs !
Pour moi, je vais utiliser 56*16 x et 72*16-8 y.
Hop, lancez et ça marche comme par magie !
Vous savez maintenant comment marche les contenus et les objets au sol, c'est donc la fin de cette troisième partie !
PARTIE 4 EN COURS DE REDACTION _________________
Shin Sekai Online - Un MMORPG Amateur en 2D
Dernière édition par Gradapin le Mer Oct 19, 2011 19:12; édité 4 fois |
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
Orikiami Shaman
![Shaman Shaman](rangs/shaman.png)
![](http://image.noelshack.com/fichiers/2012/36/1347110362-ahri-poolparty.png)
Inscrit le: 15 Mai 2010 Age: 25
Messages: 556 Localisation: Internet
|
Posté le: Sam Oct 01, 2011 18:53 Sujet du message: |
|
|
Merci ... Merci beaucoup Gradapin ! |
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
Gradapin Primé d'or
![Primé d'or Primé d'or](rangs/prime.png) Modérateur
![Modérateur Modérateur](rangs/modero.png) Stalfos
![Stalfos Stalfos](rangs/stalfos.png)
![](http://zeldaroth.fr/avatars/avatar260o.png)
Inscrit le: 15 Juil 2008 Age: 28
Messages: 1708
|
Posté le: Sam Oct 01, 2011 18:59 Sujet du message: |
|
|
Non, merci à toi de nous préparer des nouvelles aventures !
J'espère que tout marchera bien pour toi, car j'ai hâte de jouer à la version finale de ton jeu . _________________
Shin Sekai Online - Un MMORPG Amateur en 2D |
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
Orikiami Shaman
![Shaman Shaman](rangs/shaman.png)
![](http://image.noelshack.com/fichiers/2012/36/1347110362-ahri-poolparty.png)
Inscrit le: 15 Mai 2010 Age: 25
Messages: 556 Localisation: Internet
|
Posté le: Sam Oct 01, 2011 19:04 Sujet du message: |
|
|
Pour le moment j'ai un petit problème avec CodBlocks, je double clique sur le .exe codeblocks , il y a l'icône de la souris de chargement pendant 2 secondes et rien ne s'ouvre. |
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
Gradapin Primé d'or
![Primé d'or Primé d'or](rangs/prime.png) Modérateur
![Modérateur Modérateur](rangs/modero.png) Stalfos
![Stalfos Stalfos](rangs/stalfos.png)
![](http://zeldaroth.fr/avatars/avatar260o.png)
Inscrit le: 15 Juil 2008 Age: 28
Messages: 1708
|
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
Orikiami Shaman
![Shaman Shaman](rangs/shaman.png)
![](http://image.noelshack.com/fichiers/2012/36/1347110362-ahri-poolparty.png)
Inscrit le: 15 Mai 2010 Age: 25
Messages: 556 Localisation: Internet
|
Posté le: Sam Oct 01, 2011 19:20 Sujet du message: |
|
|
Windows XP et normalement à noël j'ai un nouveau pc bien plus puissant avec Windows 7
Aussi si tu as Skype pour parler de ça, ajoute orikiami (pseudo-skype) |
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
Gradapin Primé d'or
![Primé d'or Primé d'or](rangs/prime.png) Modérateur
![Modérateur Modérateur](rangs/modero.png) Stalfos
![Stalfos Stalfos](rangs/stalfos.png)
![](http://zeldaroth.fr/avatars/avatar260o.png)
Inscrit le: 15 Juil 2008 Age: 28
Messages: 1708
|
Posté le: Sam Oct 01, 2011 19:23 Sujet du message: |
|
|
Étrange, j'ai Windows XP également.
Le téléchargement s'est bien déroulé ? Aucun fichiers corrompus ?
Tu es allé dans ton dossier CodeBlocks ? Il y a bien un dossier Share et un dossier MinGW ? _________________
Shin Sekai Online - Un MMORPG Amateur en 2D |
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
Orikiami Shaman
![Shaman Shaman](rangs/shaman.png)
![](http://image.noelshack.com/fichiers/2012/36/1347110362-ahri-poolparty.png)
Inscrit le: 15 Mai 2010 Age: 25
Messages: 556 Localisation: Internet
|
Posté le: Sam Oct 01, 2011 19:28 Sujet du message: |
|
|
Il y a bien le dossier Share et MinGW dans le dossier CodeBlocks, le téléchargement ses bien déroulé , aucun fichiers corrompus. |
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
Gradapin Primé d'or
![Primé d'or Primé d'or](rangs/prime.png) Modérateur
![Modérateur Modérateur](rangs/modero.png) Stalfos
![Stalfos Stalfos](rangs/stalfos.png)
![](http://zeldaroth.fr/avatars/avatar260o.png)
Inscrit le: 15 Juil 2008 Age: 28
Messages: 1708
|
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
Orikiami Shaman
![Shaman Shaman](rangs/shaman.png)
![](http://image.noelshack.com/fichiers/2012/36/1347110362-ahri-poolparty.png)
Inscrit le: 15 Mai 2010 Age: 25
Messages: 556 Localisation: Internet
|
Posté le: Dim Oct 02, 2011 0:07 Sujet du message: |
|
|
Donc j'ai tester a 19h20, après je suis parti a 40 a une fete entre ami , je rentre a minuit: le programme est ouvert ... etrange ! |
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
Gradapin Primé d'or
![Primé d'or Primé d'or](rangs/prime.png) Modérateur
![Modérateur Modérateur](rangs/modero.png) Stalfos
![Stalfos Stalfos](rangs/stalfos.png)
![](http://zeldaroth.fr/avatars/avatar260o.png)
Inscrit le: 15 Juil 2008 Age: 28
Messages: 1708
|
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
Orikiami Shaman
![Shaman Shaman](rangs/shaman.png)
![](http://image.noelshack.com/fichiers/2012/36/1347110362-ahri-poolparty.png)
Inscrit le: 15 Mai 2010 Age: 25
Messages: 556 Localisation: Internet
|
Posté le: Dim Oct 02, 2011 10:03 Sujet du message: |
|
|
Ah maintenant ça s'ouvre rapidement, enfin ![Smile](images/smiles/icon_smile.gif) |
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
Orikiami Shaman
![Shaman Shaman](rangs/shaman.png)
![](http://image.noelshack.com/fichiers/2012/36/1347110362-ahri-poolparty.png)
Inscrit le: 15 Mai 2010 Age: 25
Messages: 556 Localisation: Internet
|
Posté le: Ven Oct 07, 2011 16:19 Sujet du message: |
|
|
Me faut de l'aide ...
Pour créer le projet j'ai bien copier et coller tout les dossier au bon endroit si j'ai bien lu (j'ai refait plusieurs fois)... |
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
link59 Esprit
![Esprit Esprit](rangs/esprit.png)
![](http://zeldaroth.fr/avatars/avatar5n.png)
Inscrit le: 22 Mar 2008
Messages: 38
|
Posté le: Mer Oct 19, 2011 13:34 Sujet du message: |
|
|
Salut,
Le lien avec les librairies a télécharger ne marche pas pourrais-tu le mettre à jour s'il te plait ?
Merci
ps : Merci pour ton formidable travail sur ce tuto ![Very Happy](images/smiles/icon_biggrin.gif) _________________
![](http://www.zeldaroth.fr/images/banieres/zelda3Tplayer.png) |
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
Gradapin Primé d'or
![Primé d'or Primé d'or](rangs/prime.png) Modérateur
![Modérateur Modérateur](rangs/modero.png) Stalfos
![Stalfos Stalfos](rangs/stalfos.png)
![](http://zeldaroth.fr/avatars/avatar260o.png)
Inscrit le: 15 Juil 2008 Age: 28
Messages: 1708
|
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
leFou Spectre
![Spectre Spectre](rangs/spectre.png)
Inscrit le: 09 Juin 2011
Messages: 5
|
Posté le: Jeu Fév 16, 2012 1:52 Sujet du message: |
|
|
Je n'arrive pas à compiler les sources!
Codeblock m'affiche 48 erreurs :
Code: | error: ISO C++ forbids declaration of 'FMUSIC_MODULE' with no type
error: ISO C++ forbids declaration of 'FSOUND_SAMPLE' with no type
error: 'FSOUND_FREE' was not declared in this scope
error: 'FSOUND_Init' was not declared in this scope |
et ça continue comme ça.
Est-ce que quelqu'un pourrait m'aider? |
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
jeanclaude34 Vautour
![Vautour Vautour](rangs/vautour.png)
Inscrit le: 03 Oct 2012 Age: 75
Messages: 258 Localisation: SETE
|
Posté le: Mar Nov 13, 2012 19:31 Sujet du message: Re: Tutoriel : Utilisation du moteur de Zelda ROTH |
|
|
Gradapin a écrit: | Bonjour à tous.
Ceci est un tutoriel expliquant les bases du moteur de Zelda ROTH pour ceux qui voudraient l'utiliser afin de modifier certaines choses comme des téléportations, des monstres, etc.
ATTENTION: ce tutoriel n'est pas un tutoriel sur le C++ et ne vous apprendera pas non-plus comment modifier tout le moteur, mais juste des éléments qui sont nécessaires à la création d'un éventuel nouveau jeu.
Ceci dit, allons-y !
PARTIE 1: Bien s'équiper pour commencer
La première partie de se tutoriel est simple. Nous allons télécharger les outils dont nous avons besoin pour modifier le jeu.
Tout d'abord, il nous faut un IDE (Integrated Development Environment), cet utilitaire va nous permettre de modifier notre code et surtout, de le compiler pour pouvoir y jouer !
Il existe plusieurs IDE, pourtant je ne vais vous en présenter qu'un seul car le but de ce tutoriel n'est pas de vous apprendre toutes ses fonctions/avantages.
Moi, j'utilise CodeBlocks, c'est un très bon IDE gratuit, vous pouvez le télécharger ici.
Une fois l'IDE télécharger, nous allons avoir besoin de librairies. Une librairie, c'est un ensemble de fonctions déjà conçues qui sont utilisées par le moteur, donc si nous voulons le recompiler nous allons avoir besoin de ces librairies !
Le moteur utilise 4 librairies: SDL, SDL_Image, SDL_GFX et FMOD. Pour vous faciliter la tache, je vous ai fait un dossier qui les contient toutes, c'est ici pour le télécharger.
Bien, maintenant, il nous faut un dernier élément, le plus important: le code du moteur, bien évidemment. Pour cela, vous pouvez télécharger les sources ici !
PARTIE 2: Obtenir une première compilation
Cette partie est très importante, et c'est souvent la plus problématique car il peut survenir de nombreuses erreurs de compilations, donc si vous en avez une particulière et que vous n'arrivez toujours pas à compiler à la fin de cette partie, n'hésitez pas à laisser un commentaire.
Alors, premièrement, installez CodeBlocks si ce n'est pas déjà fait. Ensuite, faites File > New > Project. Dans la liste, séléctionnez SDL project, puis faites Next. Ensuite, il vous demande d'entrer le nom de votre projet et le répertoire de votre ordinateur où sauvegarder votre projet. Les deux derniers champs se remplissent automatiquement, donc faites Next.
Maintenant, il vous demande de lui signaler où se trouve vos librairies. Mais vu qu'elles sont tout en désordre dans le dossier que je vous ai donné, nous allons devoir les ranger. Donc pour l'instant, laissez CodeBlocks où il est puis allez dezipper le dossier Librairies. Allez dans le dossier Include et copiez les deux dossiers. Allez maintenant dans le dossier où vous avez installé CodeBlocks, puis dans MinGW > Include, et copiez les dossiers. Ensuite, retournez dans le dossier Librairies, et allez maintenant dans Lib. Allez dans le dossier FMOD et copiez tous les fichiers. Maintenant allez dans CodeBlocks > MinGW > Lib, et collez les fichiers. Faites de même avec les fichiers du dossier SDL. Une fois tout copié, allez dans CodeBlocks > MinGW > Include > SDL, et copiez SDL.h, collez le dans le dossier Include avec tous les autres fichiers, puis dans le dossier MinGW. Une fois tout ça fait, il nous reste plus qu'à renseigner CodeBlocks où tous les fichiers se trouvent !
Cliquez donc sur ..., CodeBlocks va vous ouvrir une grande fenêtre, mais fermez-là, et il vous en ouvrira une plus petite qui vous demandera de séléctionner un dossier. Séléctionnez le dossier MinGW dans le répertoire où vous avez installé CodeBlocks, puis faites Next. Ensuite, il vous demande de choisir le compiler, donc séléctionnez GNU GCC Compiler et cochez Create "debug" configuration puis Create "release" configuration. Faites finalement Finish, pour créer votre projet !
Votre projet créé, les ennuis ne font que commencer !
Tout d'abord, allez dans le dossier des sources de Zelda ROTH puis dans le dossier SRC, puis copiez tous les fichiers .cpp et .h . Copiez-les à la racine de votre projet. Retournez dans le dossier des sources et copiez le dossier data. Collez-le également à la racine de votre projet.
À gauche, vous devriez voir le nom de votre projet en gras. Effectuez un clic droit dessuis puis cliquez sur Add files. Maintenez la touche CTRL puis séléctionnez tous les fichiers .cpp et .h, puis faites Ouvrir. Il va maintenant vous ouvrir une petite fenêtre, mais ne vous en occupez pas et faites OK.
Maintenant, vous devez lier les librairies externes (les librairies autre que la SDL) à votre projet. Tout d'abord, cliquez sur l'onglet Project puis Properties. Allez dans la partie Build targets, puis à droite vous devriez apercevoir Type: et en face, une liste déroulante. Si GUI application n'est pas séléctionné, alors séléctionnez-le puis faites OK. Ensuite, allez dans Project > Build Options, puis cliquez sur l'onglet Link settings. Maintenant, cliquez sur add, puis recherchez le fichier SDL_image.lib qui devrait se situer dans votre dossier MinGW > Lib. Une fois fait, CodeBlocks vous demande quelque chose, et surtout, cochez Non, puis faites OK. Faites de même pour sdlgfx.lib puis pour libfmod.a. Une fois toutes ces librairies ajoutées, cliquez finalement OK pour fermer la fenêtre.
Vous avez peut-être noté que dans le dossier Librairies > Lib, il y a des fichiers dll. Copiez-les tous, et collez-les à la racine de votre projet. Si vous ne le faites pas, lorsque vous lancerez le jeu, il vous dira que ces dll sont manquantes et vous ne pourrez pas jouer.
Dernière étape: indiquer à CodeBlocks où se trouve le compilateur à utiliser. Pour cela, allez dans Settings > Compiler and debugger, puis dans la partie Toolchain executables, cliquez sur Auto-detect. Si il ne vous détecte rien du tout, alors vous pouvez lui indiquer manuellement en séléctionnant le dossier MinGW.
Bien, une fois toutes ces étapes accomplies, l'heure de vérité approche.
À gauche, il devrait y avoir une icone de roue munie d'une petite flèche avec le label Build and run, une fois trouvée, cliquez dessus !
Patientez. Si beaucoup de phrases écrites en rouge s'affichent dans la petite boite en bas, cela veut dire évidemment que la compilation a échouée, donc pour cela, écrivez-moi leur contenu dans les commentaires pour que je puisse vous aider, sinon, c'est que le jeu va se lancer d'une seconde à l'autre !
PARTIE 3: Let's write some code: Les coffres et objets au sol
Nous nous situons maintenant dans le vif du sujet !
Tout au long de cet article, je vais réaliser en parallèle une mini-aventure, qui sera disponible à la fin du tutoriel.
Dans cette partie, nous allons voir comment sont gérés les objets que nous ramassons au sol, pour pouvoir les changer et également changer leurs positions !
Alors premièrement, sachez que le fichier que nous allons le plus utiliser est Monde.cpp, pour cela, vous pouvez le séléctionner à gauche, si vous ouvrez toutes les listes contenant les fichiers (en dessous du nom de votre projet). Pour le séléctionner, double cliquez dessus !
Imaginons maintenant que je veux changer le coffre où se trouve le bouclier de départ, imaginons que je veux mettre des gants. Pour cela, vu que le fichier est très grand, nous allons utiliser une fonction très pratique: rechercher !
Pour ça, effectuez un CTRL + F pour aller plus vite, et recherchez le mot bouclier (faites attention que certaines options comme la casse ne soient pas activés). Personnellement, la fonction rechercher m'amène à la ligne suivante :
Code: | if (!gpJoueur->getBouclier()) setValeur(15*16, 10*16, 303, 0, PLEIN, C_BOUCLIER); |
Alors tout d'abord, un petit point sur le C++.
Le if est un outil de comparaison qui est très important. À chaque fois que nous avons besoin de faire une comparaison, nous utilisons un if. Ici, le if sert à savoir si le joueur ne possède pas le bouclier (notez le ! qui exprime la négation). La commande qui suit est celle que le programme doit effectuer si la condition est remplie, donc dans ce cas, cela veut dire qu'il met un coffre content un Bouclier.
À la ligne suivante, nous pouvons remarquer une ligne un peu pareil, mais cette fois il a un else. Le else peut se traduire par "sinon", ce qui est donc ce qu'il se passe si la condition n'est PAS remplie. Dans ce cas, ça signifie: Si le joueur possède le bouclier. Et dans ce cas, ça modifie le coffre par un coffre vide qui ne possède aucun objet !
Est-ce plus clair maintenant ?
Bien, maintenant, essayons de le modifier !
Nous pouvons remarquer que dans le code, il y a C_BOUCLIER, (Contenu Bouclier), cela veut dire que nous allons utiliser quelque chose utilisant le préfixe C_. Pour savoir le nom de tous les "objets" utilisés, je vous conseille d'aller regarder dans le fichier Common.h, c'est là que toutes les variables constantes sont définies, donc nous pouvons regarder tous les noms et les remplacer pour voir ce que ça fait !
Tout d'abord, dans ce fichier je peux voir que le mot enum revient souvant. Et bien c'est là que toutes les listes sont définies car le moteur utilise plusieurs listes. Il y a les contenus (les objets qu'on prend dans les coffres), il y a les items, ceux qu'on trouve par terre et encore pleins d'autres. Nous verrons les autres un autre moment, pour l'instant, seuls les contenus nous intéressent. Donc regardons la liste définie par enum Type_contenu. Nous pouvons apercevoir qu'il y a bien C_GANTS. Donc maintenant, retournons dans Monde.cpp et changeons C_Bouclier par C_GANTS, puis compilons !
Ça fonctionne !
En revanche on peut remarquer que si je quitte la map et que je reviens, le coffre sera revenu comme avant. Mais c'est tout à fait normal, nous n'avons pas changé la condition. Donc maintenant, nous allons essayer avec un peu de logique. Vu qu'il y avait marqué !gpJoueur->getBouclier() nous allons essayer en remplaçant par !gpJoueur->getGants(). Compilons et... Ça ne fonctionne pas !
En effet, nous avons essayé au hasard, mais rien ne nous dit que la fonction a été crée. Même si elle existe très probablement, nous ne connaissons pas son nom exact. Pour le savoir, nous allons regarder un nouveau fichier. Vu que nous utilisons gpJoueur, ce que cherchons doit probablement se trouver dans Joueur.h !
Dans les fichiers .h, nous pouvons trouver toutes les déclarations des fonctions sans en avoir le code (le code étant dans les fichiers C++). Cela est pratique, car le code ne nous intéresse pas vraiment, nous voulons seulement rechercher une fonction qui pourrait corriger notre problème. Après avoir attentivement regardé la liste des fonctions, nous pouvons remarquer une fonction nommée hasObjet(int i). Cette fonction est très pratique car elle va nous permettre de savoir si le joueur tient tel objet.
Retournons dans Monde.cpp. Maintenant, nous ne savons toujours pas comment s'utiliser hasObjet. Mais comme nous avons de la chance (cette fonction étant utilisée de nombreuses fois dans Monde.cpp), nous pouvons remarquer quelques lignes plus bas: hasObjet(O_LIVRE). La fonction s'utilise donc avec une liste ayant le préfixe O_. Pour cela, essayons donc en remplaçant gpJoueur->getBouclier() par gpJoueur->hasObjet(O_GANTS), puis compilons !
Miracle, ça marche.
Vu que ce que nous avons fait n'a que peu d'intérêt, je propose qu'on remette le bouclier à la place où il était. Pour cela, faites retour jusqu'à avoir le fichier d'origine (CTRL+Z).
Maintenant, regardons la fonction setValeur qui semble être utilisée beaucoup dans ce fichier. On peut remarquer que dans cette fonction, il y a plusieurs valeurs qui sont entre parenthèses. Celles-ci sont appelées paramètres. Ces paramètres sont séparés par des virgules. Les deux premiers paramètres sont la position de la valeur à changer. Si la position est multipliée par 16, c'est parce que la position est utilisée en pixels. Une case étant 16 pixels, si on veut compter en case (car c'est plus facile), nous n'avons qu'à multiplier par 16. Le premier paramètre est la position horizontale (0 = tout à gauche). Le deuxième paramètre est la position verticale (0 = tout en haut).
Le troisième paramètre, c'est le numéro de la case. Celle-ci est visible dans l'éditeur de map (en bas, là où il y a marqué "Motif:"). Ce numero correspond donc à l'image du coffre dans notre cas. Le paramètre suivant fait référence aux collisions. Dans notre cas, il y a marqué PLEIN, cela équivaut à des collisions rouges dans l'éditeur, ça veut dire que rien ne passe. (Les noms des collisions sont visibles dans le fichier Common.h). Et le dernier paramètre est finalement le contenu de la case (ce qui est donc utilisé pour les coffres).
Maintenant que nous avons vu les coffres, nous allons maintenant nous attaquer aux objets au sol !
Pour cela, nous allons prendre l'exemple de l'épée. Pour ça, nous allons rechercher le mot epee (sans accents, car les accents ne sont pas utilisés en C++ comme dans la plupart des langages).
Bingo, nous avons trouvé la ligne:
Code: | if (!gpJoueur->getEpee()) gpJeu->ajouteObjet(I_EPEE, 50*16, 68*16-8); |
Nous pouvons remarquer que les commandes sont différentes, mais utilisent la même structure. Cette fois, le paramètre servant à signaler l'objet utilisé utilise le préfixe I_. Les paramètres suivant sont donc la positions (le second, x, axe horizontal, et le troisième, y, axe vertical).
Lorsque vous voulez changer les positions, je vous conseille de vous munir de l'éditeur de map pour qui vous signale en bas à gauche la position en cases (donc multiplié par 16), et à droite, la position au pixel près !
ATTENTION : Lorsque vous choisissez de positionner un objet au pixel près, gardez en mémoire que le point de coordonnée que vous avec envoyé à la fonction sera le point en haut à gauche de l'objet utilisé. Donc lorsque vous placez un objet, sâchez sa taille avant pour pouvoir directement choisir la bonne coordonnée.
Maintenant, imaginons que je veux changer l'épée de place. Pour cela, je vais regarder sur l'éditeur où je veux le placer, puis je vais remplacer les valeurs !
Pour moi, je vais utiliser 56*16 x et 72*16-8 y.
Hop, lancez et ça marche comme par magie !
Vous savez maintenant comment marche les contenus et les objets au sol, c'est donc la fin de cette troisième partie !
PARTIE 4 EN COURS DE REDACTION |
Bonsoir Gradapin, c'est trés intéressant, merci: As tu fait une suite à ce tutoriel s'il te plait j'aimerais l'avoir _________________ Bonjour à tous d'un papy de 73 ans, zeldamaniac |
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
Gradapin Primé d'or
![Primé d'or Primé d'or](rangs/prime.png) Modérateur
![Modérateur Modérateur](rangs/modero.png) Stalfos
![Stalfos Stalfos](rangs/stalfos.png)
![](http://zeldaroth.fr/avatars/avatar260o.png)
Inscrit le: 15 Juil 2008 Age: 28
Messages: 1708
|
Posté le: Mar Nov 13, 2012 20:18 Sujet du message: |
|
|
Eh bien j'avais commencé à en rédiger une mais je l'ai hélas perdue lors d'un formattage, je ne l'avais pas mise en ligne.
Donc pour l'instant je n'ai rien mais peut-être que lorsque j'aurais un peu de temps libre je continuerais ![Wink](images/smiles/icon_wink.gif) _________________
Shin Sekai Online - Un MMORPG Amateur en 2D |
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
jeanclaude34 Vautour
![Vautour Vautour](rangs/vautour.png)
Inscrit le: 03 Oct 2012 Age: 75
Messages: 258 Localisation: SETE
|
Posté le: Mar Nov 13, 2012 20:50 Sujet du message: |
|
|
Gradapin a écrit: | Eh bien j'avais commencé à en rédiger une mais je l'ai hélas perdue lors d'un formattage, je ne l'avais pas mise en ligne.
Donc pour l'instant je n'ai rien mais peut-être que lorsque j'aurais un peu de temps libre je continuerais ![Wink](images/smiles/icon_wink.gif) |
ce serait formidable, c'est trés bien expliqué. Excuse moi je suis novice et j'ai envie de mettre en application tout cela. _________________ Bonjour à tous d'un papy de 73 ans, zeldamaniac |
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
|
|
|
Vous ne pouvez pas poster de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas voter dans les sondages de ce forum
|
|