Introduction : le jeu du combat contre le monstre en Javascript
Aujourdâhui je vais commenter le code que jâai Ă©crit sur un projet de dĂ©couverte des concepts Vue.js. Nous sommes obligĂ©s de passer par lĂ en tant que dĂ©veloppeur quand nous sommes confrontĂ©s Ă une nouvelle technologie.
Le but du projet est de crĂ©er un RPG simple. Un systĂšme dâattaque, de soin et de coup spĂ©cial. Une classique.
Cette application est trĂšs minimaliste car câest un projet pensĂ© pour les personnes nâayant jamais utilisĂ© de frameworks JavaScript. Câest pourquoi la structure des fichiers ne ressemble pas Ă un projet Vue.js plus classique. On utilise Ă©galement la librairie via CDN et non via une installation avec Node.js.
Mon but avec cet article est de partager mes acquis en détaillant le code source.
Comment ça fonctionne : décryptage du code source
Cet article est Ă voir comme un partage de connaissances. Si une faute vous saute aux yeux, je vous invite vivement Ă me contacter sur LinkedIn.
Connexion entre Vue.js et notre HTML
Afin dâutiliser Vue.js rapidement, nous lâajouterons au projet via une balise <script>
.
Pour fonctionner Vue.js doit ĂȘtre montĂ© dans notre fichier HTML principal. Pour faire simple, on lui indique oĂč travailler. GĂ©nĂ©ralement on consacre une balise <div>
avec lâidentifiant app
. Vous ĂȘtes libre sur le choix de lâidentifiant. Ici, jâutilise lâidentifiant game
.
|
|
Une fois le fichier HTML créé et copiĂ©, vous pouvez lâouvrir dans votre navigateur favori. Pour lâinstant rien ne sâaffiche, on peut juste vĂ©rifier que les paquets de Vue.js ont bien Ă©tĂ© tĂ©lĂ©chargĂ©s en allant dans la console du navigateur comme ceci.
La deuxiĂšme Ă©tape pour permettre Ă Vue.js dâintĂ©ragir avec le DOM se passe cĂŽtĂ© JavaScript. Jâai nommĂ© le fichier app.js
, le choix du nom nâest pas important, il suffit juste quâil corresponse Ă celui de la balise <script>
du fichier HTML. On peut vérifier, comme avec le fichier de Vue.js, si notre fichier apparaßt dans la console.
Viens donc le moment oĂč lâon Ă©crit un peu de JavaScript. Ici, on va initialiser lâapplication avec lâobjet Vue
. Pas besoin dâimport, lâobjet est rendu disponible grĂące au fichier tĂ©lĂ©chargĂ© prĂ©cedemment.
|
|
Tadaaa, notre script est maintenant prĂȘt Ă modifier le DOM.
La fonction getRandomValue()
|
|
Cette fonction permet de retourner un nombre aléatoire compris entre la variable min
et max
. Elle sera utilisée par plusieurs de nos fonctions par la suite.
Math.random()
génÚre un nombre aléatoire entre 0 (inclus) et 1 (exclus). Ensuite, on multiplie le nombre généré pour avoir un plus grand interval. Si on multiplie par 3, le nombre généré sera compris entre 0 et 3.
Mais attention, si on utilise que la fonction random()
, le nombre gĂ©nĂ©rĂ© sera un nombre dĂ©cimal. Afin dâĂ©viter ce comportement, on utilise la fonction Math.floor()
qui permet dâarrondir un nombre Ă lâentier infĂ©rieur ou Ă©gal.
Les données disponibles
Pour cette application il y a deux types de donnĂ©es. Lâun dans la propriĂ©tĂ© data
(rĂ©servĂ©e aux donnĂ©es simples) et lâautre dans la propriĂ©tĂ© computed
. (réservée aux données ayant de la logique)
Données dans data
|
|
playerHealth
: représente la vie actuelle du joueur.monsterHealth
: représente la vie actuelle du monstre.currentRound
: numéro de la manche en cours.winner
: nom du vainqueur.logMessages
: liste des messages du journal.
Données dans computed
|
|
-
monsterHealthStyles()
etplayerHealthStyles()
: dĂ©termine le style (niveau) de la barre de vie du monstre et du joueur. La propriĂ©tĂ© sâassure que la valeur ne soit jamais infĂ©rieure Ă zĂ©ro. -
mayUseSpecialAttack()
: dĂ©termine si lâattaque spĂ©ciale du joueur peut ĂȘtre lancĂ©e. Tous les 3 rounds, la condition est vraie, alors lâattaque est rendue disponible.
Les fonctions disponibles
Afin de permettre certaines actions au joueur et au monstre, il faut implémenter des fonctionnalités. La logique et les conséquences de ces actions sont codées dans les fonctions de notre composant Vue.
Les fonctions suivantes se trouvent dans la propriété methods
.
|
|
this.currentRound++
permet dâincrĂ©menter le nombre de rounds. Il apparaĂźtra dans chaque action faite par le joueur. On gĂ©nĂšre Ă©galement une valeur alĂ©atoire comprise entre 5 et 12 qui reprĂ©sente la puissance de notre attaque. this.addLogMessage()
permet dâajouter cette action aux logs, puis on lance lâattaque du monstre en appelant this.attackPlayer()
.
|
|
Cette fonction a la mĂȘme logique que la prĂ©cĂ©dente sauf quâon dĂ©cremente la vie du joueur Ă la place de celle du monstre. Ne vous mĂ©prenez pas, chaque action a des consĂ©quences.
|
|
Lâattaque spĂ©ciale est sensiblement identique Ă lâattaque basique. La diffĂ©rence se fait dans la gĂ©nĂ©ration du nombre alĂ©atoire, allant de 11
Ă 19
au lieu de 8
Ă 15
.
|
|
La fonction de guĂ©rison permet de soigner le joueur uniquement. Elle sâassure Ă©galement que la vie du joueur ne dĂ©passe jamais 100
. Cette action est également enregistrée dans les logs.
|
|
La fonction startNewGame()
réinitialise toutes les données du jeu. Ce sont les données qui se trouve dans la propriété data()
.
|
|
Il est Ă©galement possible dâabandonner .. mais personne a besoin de ce bouton. đ
|
|
addLogMessage()
permet dâajouter les actions effectuĂ©es dans les logs.
Petite précision, unshift()
est une mĂ©thode permettant dâajouter du contenu au dĂ©but dâun tableau.
à quoi ça ressemble ?
Nous sommes arrivés à la partie finale de cet article : la révélation du contenu, la levée des rideaux, le grand reveal.
Ă la premiĂšre connexion sur lâapplication, voici ce Ă quoi ressemble lâĂ©cran.
Une interface des plus basiques. En premier, on retrouve les points de vie de notre hĂ©ros et du monstre. Ensuite on a le âbloc dâactionsâ oĂč se regroupe toutes les actions possibles.
Et enfin en cours de partie, lors de nos premiĂšres actions, lâĂ©cran de log du champ de bataille apparaĂźt. Il permet de voir lâhistorique des actions menĂ©es par le joueur et le monstre. Ainsi que la valeur associĂ©e Ă chaque action.
Conclusion
Câest dĂ©jĂ la fin de mon premier article sur mon blog. GrĂące Ă ce projet on apprend les premiers concepts de Vue.js. On ne rentre pas dans les dĂ©tails du fonctionnement du framework mais ça peut-ĂȘtre un bon premier projet Ă reproduire pour les dĂ©butants.
On peut imaginer des amĂ©liorations comme la possibilitĂ© de mettre des niveaux dâexpĂ©riences, combattre plusieurs ennemis Ă la suite, acheter de lâĂ©quipement pour amĂ©liorer nos statistiques. Je laisse libre court Ă votre imagination.
Comme dit en introduction, nâhĂ©sitez pas Ă me contacter sur LinkedIn si vous avez une remarque.
Il me semble Ă©galement important de crĂ©diter la personne qui est Ă lâorigine de ce projet, que jâai suivi Ă mes dĂ©buts sur Vue.js (cours de qualitĂ©) :
Et bien sûr le lien du dépÎt GitHub : vuejs-monster-slayer