<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: RoyS122</title>
    <description>The latest articles on DEV Community by RoyS122 (@roys122).</description>
    <link>https://dev.to/roys122</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1273729%2Fa5b26c9a-7b82-4084-b1da-62ad0808bff0.png</url>
      <title>DEV Community: RoyS122</title>
      <link>https://dev.to/roys122</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/roys122"/>
    <language>en</language>
    <item>
      <title>Mon premier patch Hare</title>
      <dc:creator>RoyS122</dc:creator>
      <pubDate>Fri, 24 Jul 2026 10:26:45 +0000</pubDate>
      <link>https://dev.to/roys122/mon-premier-patch-hare-5g3e</link>
      <guid>https://dev.to/roys122/mon-premier-patch-hare-5g3e</guid>
      <description>&lt;h1&gt;
  
  
  Mon premier patch Hare
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Cet article n'a pas pour but de t'expliquer dans les grandes longueurs à quel point au prix d'efforts incroyables j'ai vaillamment écrit un patch de 9 lignes pour un outil Hare !&lt;/p&gt;

&lt;p&gt;L'objectif est bien entendu de te présenter le langage &lt;a href="https://harelang.org/" rel="noopener noreferrer"&gt;Hare&lt;/a&gt; et de t'expliquer ce qui a retenu mon attention à son égard ainsi quej'ai appris cette nuit en préparant et en soumettant pour la première fois un patch et à fortiori par mail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le langage Hare
&lt;/h2&gt;

&lt;p&gt;On parle ici d'un langage système, exit Go et son &lt;em&gt;garbage collector&lt;/em&gt; ou Rust et son &lt;em&gt;automatic memory management&lt;/em&gt;. Hare permet une gestion fine de la mémoire, avec quelques options de confort quand même comme le statement &lt;code&gt;defer&lt;/code&gt; qui permet d'exécuter l'instruction en sortant du contexte ce qui permet d'appeler par exemple &lt;code&gt;free(...)&lt;/code&gt; et d'éviter les oublis.&lt;/p&gt;

&lt;p&gt;Une autre option de confort est l'updater (auquel j'ai contribué à ma minuscule échelle) ou même le compilateur qui permet la cross compilation, tout ça fait de Hare toolchain une suite d'outils très intéressante pour un développeur qui aime mettre les mains dans le cambouis.&lt;/p&gt;

&lt;p&gt;Donc ce langage système a une autre particularité, il est conçu et designé pour rester simple, stable et robuste... l'objectif assumé est que la toolchain complète soit compréhensible par un seul programmeur (et accessoirement que le langage vive pendant au moins 100 ans).&lt;/p&gt;

&lt;p&gt;Je pense qu'ils ont des arguments pour réussir, je reviens sur ce sujet par la suite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ce que j'aime dans leur philosophie
&lt;/h2&gt;

&lt;p&gt;À une époque où le niveau d'abstraction est toujours grandissant (à plus forte raison avec l'avènement des LLMs et autres outils IA pour le dev) je trouve particulièrement intéressant un langage qui dans son code source exclut l'IA et qui vise à rester le plus simple possible, et à s'éloigner de tous les désagréments que cause l'IA sur d'une part la clarté du code source et de l'autre sa compréhension par ses auteurs.&lt;/p&gt;

&lt;p&gt;Autre chose que je trouve très appréciable c'est que les (à date) &lt;a href="https://harelang.org/who/" rel="noopener noreferrer"&gt;12 maintainers&lt;/a&gt; sont vraiment réactifs aux patchs, et en plus très actifs (il y a un merge quotidien de dizaines de patchs).&lt;/p&gt;

&lt;h2&gt;
  
  
  Apprentissage
&lt;/h2&gt;

&lt;p&gt;Ce que je retiens de ce premier contact avec la contribution open source (encore plus par email).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se plonger dans le code d'un autre pour le comprendre et fixer quelque chose, y ajouter une feature qui s'intègre parfaitement dans le style et la philosophie du programme est très enrichissant, permet de découvrir de nouveaux paradigmes.&lt;/li&gt;
&lt;li&gt;Cela paraît idiot à préciser mais c'est très gratifiant aussi.&lt;/li&gt;
&lt;li&gt;L'écosystème autour de Hare et du logiciel, bien que restreint, est vraiment très actif et intéressant à suivre.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Bon voilà, je te reparlerai peut-être de Hare par la suite, soit à l'occasion d'un projet personnel en Hare soit à l'occasion d'une contribution peut-être plus intéressante à détailler !&lt;/p&gt;

&lt;p&gt;Sur ce si cet article t'a plu je te recommande d'aller lire les autres articles du blog, adopte toi aussi un lièvre :) et bonne journée à toi.&lt;/p&gt;

</description>
      <category>harelang</category>
      <category>fr</category>
      <category>opensource</category>
      <category>software</category>
    </item>
    <item>
      <title>J'ai créé une librairie Go pour remplacer Cobra</title>
      <dc:creator>RoyS122</dc:creator>
      <pubDate>Sun, 19 Jul 2026 20:29:47 +0000</pubDate>
      <link>https://dev.to/roys122/jai-cree-une-librairie-go-pour-remplacer-cobra-17dm</link>
      <guid>https://dev.to/roys122/jai-cree-une-librairie-go-pour-remplacer-cobra-17dm</guid>
      <description>&lt;h2&gt;
  
  
  Pourquoi remplacer Cobra
&lt;/h2&gt;

&lt;p&gt;Initialement j'utilisais &lt;a href="https://github.com/spf13/cobra" rel="noopener noreferrer"&gt;Cobra&lt;/a&gt; sur mon projet &lt;a href="https://github.com/RoyS122/GoStamp-CLI" rel="noopener noreferrer"&gt;GoStamp&lt;/a&gt;, qui est mon outil CLI (Command Line Interface) qui permet de compresser, ajouter des filigranes, gérer les licences et modifier les métadonnées de gros batchs d'images, mais j'y reviendrai probablement dans un article dédié.&lt;br&gt;
Cobra donc, est une librairie qui permet de créer des CLI, c'est une des librairies les plus connues et un standard en golang pour ce type d'application.&lt;br&gt;
Mon problème avec Cobra c'est la taille de cette librairie (une fois compilée) et les allocations mémoire masquées assez lourdes (Notamment à cause de la gestion des flags avec des clés textuelles).&lt;/p&gt;
&lt;h2&gt;
  
  
  Minimalisme et optimisation
&lt;/h2&gt;

&lt;p&gt;Pour mon cas d'usage, en réécrivant une librairie, j'ai choisi de passer les valeurs de flags avec des pointeurs directs plutôt qu'avec une map intermédiaire, cela permet de limiter les réallocations.&lt;br&gt;
Aussi j'ai fait des choix d'architecture pour minimiser la taille de la librairie, notamment dans le parsing des flags qui utilise une machine à états pour vérifier si un flag a été détecté précédemment ou si c'est un nouveau flag.&lt;br&gt;
Un autre choix d'architecture pour cette librairie : limiter les types (statiques dans la librairie) à 6 types principaux qui répondent à tous les cas d'usages principaux pour ce genre d'outil :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;string&lt;/li&gt;
&lt;li&gt;int&lt;/li&gt;
&lt;li&gt;float64 ( important pour les variables de facteur ou de ratio )&lt;/li&gt;
&lt;li&gt;uint8 (utile pour l'optimisation stockés sur un seul octet)&lt;/li&gt;
&lt;li&gt;uint64 ( important pour des indications de tailles ou la gestion d'images )&lt;/li&gt;
&lt;li&gt;booléen &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cobra ou d'autres parseurs, pour des raisons qui leur sont propres (certainement de la facilité ou pour rester conforme au reste de la librairie), ont fait le choix de stocker les short flags (&lt;code&gt;-p&lt;/code&gt; ou &lt;code&gt;-a&lt;/code&gt;) sous forme de string, ce qui oblige le garbage collector de Go à travailler.&lt;br&gt;
De mon côté j'ai choisi de garder simplement le caractère en entier stocké sur la pile (ne passe pas par le garbage collector).&lt;/p&gt;
&lt;h2&gt;
  
  
  À quoi ça ressemble ?
&lt;/h2&gt;

&lt;p&gt;L'API est pensée pour être la plus fluide et explicite possible. Tu déclares ta commande, tu lies tes variables directement via leurs pointeurs dans le &lt;code&gt;init()&lt;/code&gt;, et c'est tout. Zéro intermédiaire textuel.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/RoyS122/LiteCLI"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;outputPath&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;quality&lt;/span&gt;    &lt;span class="kt"&gt;int&lt;/span&gt;
    &lt;span class="n"&gt;verbose&lt;/span&gt;    &lt;span class="kt"&gt;bool&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;ProcessCmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;litecli&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;"process"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Short&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Compresse et traite un lot d'images"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;litecli&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// Tes flags sont déjà typés et injectés ici !&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Traitement du dossier : %v (Qualité : %d%%)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quality&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Le binding direct par pointeur : propre, safe et sans allocation&lt;/span&gt;
    &lt;span class="n"&gt;ProcessCmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StringVarP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;outputPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"output"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'o'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"./dist"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ProcessCmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IntVarP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;quality&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"quality"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'q'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ProcessCmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BoolVarP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"verbose"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'v'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Gains
&lt;/h2&gt;

&lt;p&gt;Après mon travail ce week-end sur cette petite librairie j'ai testé la différence entre mon binaire avec cobra et mon binaire sans :&lt;br&gt;
Le binaire avec cobra pèse 6 Mo (cobra représente une petite partie de ça car j'ai les libs d'images qui pèsent assez lourd).&lt;br&gt;
Le binaire sans cobra pèse 5.1 Mo ce qui représente une diminution de ~ 15 %.&lt;/p&gt;

&lt;p&gt;0 dépendance pour mon projet GoStamp.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un projet codé en live
&lt;/h2&gt;

&lt;p&gt;Pour la petite histoire, j'ai développé une grosse partie de cette librairie en stream sur Twitch. C'est toujours un exercice sympa de partager ce genre de session de dev brut, de bloquer sur des machines à états, et de peaufiner les optimisations en direct avec le chat.&lt;/p&gt;

&lt;p&gt;Si tu veux suivre les prochains streams ou voir l'envers du décor de mes projets (comme le dev de GoStamp), n'hésite pas à venir faire un tour sur &lt;a href="https://www.twitch.tv/roysdev" rel="noopener noreferrer"&gt;ma chaîne Twitch&lt;/a&gt; et tu peux aller voir le replay du stream &lt;a href="https://www.youtube.com/watch?v=tTR0EQlMzvA" rel="noopener noreferrer"&gt;ici&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Publication de la librairie
&lt;/h2&gt;

&lt;p&gt;Une fois terminée, car oui je l'ai terminée, boosté après avoir regardé la &lt;a href="https://www.youtube.com/watch?v=EGLoKbBn-VI" rel="noopener noreferrer"&gt;conférence de Eskil Steenberg&lt;/a&gt; sur la manière de terminer ses logiciels, et j'ai fait en sorte comme mis en avant dans cette conférence que d'autres puissent construire par-dessus ma librairie (comme j'avais construit mon app sur Cobra).&lt;br&gt;
Pour cela j'ai publié le tout sur github sur un repos en suivant les prérequis pour créer un package Go compatible avec les imports natifs de go (go get etc).&lt;/p&gt;

&lt;p&gt;Tu peux retrouver ma librairie sur le &lt;a href="https://pkg.go.dev/github.com/RoyS122/LiteCLI#section-readme" rel="noopener noreferrer"&gt;site de package de golang&lt;/a&gt; et sur &lt;a href="https://github.com/RoyS122/LiteCLI" rel="noopener noreferrer"&gt;github&lt;/a&gt;. N'hésite pas à aller voir et tester si tu as des projets qui nécessitent une interface en ligne de commande.&lt;/p&gt;

</description>
      <category>cobra</category>
      <category>go</category>
      <category>cli</category>
      <category>optimisation</category>
    </item>
    <item>
      <title>J'ai joué à un jeu ... Dredge !</title>
      <dc:creator>RoyS122</dc:creator>
      <pubDate>Wed, 24 Sep 2025 12:58:22 +0000</pubDate>
      <link>https://dev.to/roys122/jai-joue-a-un-jeu-dredge--2738</link>
      <guid>https://dev.to/roys122/jai-joue-a-un-jeu-dredge--2738</guid>
      <description>&lt;p&gt;Bienvenue sur l'île de la &lt;strong&gt;Grand'Moêlle&lt;/strong&gt; où mon aventure débute.&lt;br&gt;&lt;br&gt;
Prépare-toi à embarquer dans mon raffiot pour découvrir les secrets que cache &lt;em&gt;Dredge&lt;/em&gt; ! 🌊🐟&lt;/p&gt;




&lt;h2&gt;
  
  
  🌅 Éveil à la Grand'Moêlle
&lt;/h2&gt;

&lt;p&gt;Je me réveille sur une île sans comprendre &lt;em&gt;comment&lt;/em&gt; ni &lt;em&gt;pourquoi&lt;/em&gt; je suis là.&lt;br&gt;&lt;br&gt;
Tout le monde semble certain que je suis le nouveau pêcheur de l'île. Pourtant je n'ai aucun souvenir, si ce n'est celui de m'être échoué non loin de là.&lt;/p&gt;

&lt;p&gt;C'est le maire qui, le premier, vient à moi. Il me propose gentiment de me prêter un bateau pour remplacer l'épave qui me servait de navire. Bien aimable, je pourrai de cette manière aller pêcher et m'acquitter de ma &lt;strong&gt;dette nouvellement créée&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Je pars donc en mer pour la première fois : l'occasion de visiter la petite crique qui se présente devant la Grand'Moêlle. Le bateau n'est pas en très bon état et la cale pas très spacieuse… cependant j'arrive à entasser quelques poiscailles malgré tout.&lt;br&gt;&lt;br&gt;
J'entrevois aussi la jumelle de l'île : il paraît que le maire de cette île a disparu... Je pense aller y faire un tour bientôt. &lt;/p&gt;




&lt;h2&gt;
  
  
  🌫️ La brume murmure
&lt;/h2&gt;

&lt;p&gt;À mon retour, la &lt;strong&gt;gardienne du phare&lt;/strong&gt; semble m'attendre. Elle est plutôt énigmatique et semble vouloir m'avertir de quelque chose. Je ne m'y attarde pas : je dois vendre la pêche du jour — et vite — car plus je perds de temps, plus les poissons risquent de pourrir.&lt;br&gt;&lt;br&gt;
S'ils ne sont plus frais, ils n'auront plus aucune valeur aux yeux du poissonnier. Quel délicat celui-là encore !&lt;/p&gt;

&lt;p&gt;Le poissonnier veut que je lui ramène un spécimen que je n'avais encore jamais croisé car, évidemment… il ne sort que la &lt;strong&gt;nuit&lt;/strong&gt;. 🌙&lt;br&gt;&lt;br&gt;
Ce vendeur de saumon œuvre à ma perte sans doute ! Bon, je verrai demain : pour l'heure, je vais dormir.&lt;/p&gt;

&lt;p&gt;Le lendemain, avec l'argent que m'a rapporté la pêche de la veille, j'ai pu &lt;strong&gt;rembourser le maire&lt;/strong&gt; pour le prêt de ma chaloupe. Une bonne chose de faite.&lt;/p&gt;

&lt;p&gt;Ce jour-ci je continue à parcourir la mer afin d'amasser plus d'argent et d'améliorer mon bateau. Celui-ci m'appartenait maintenant, mais demeurait en mauvais état.&lt;br&gt;&lt;br&gt;
Le soir venu, je décide de tarder un peu afin d'essayer de mener à bien la mission que m'a confiée le poissonnier. En cherchant, je tombe nez à nez avec le bon poisson : &lt;strong&gt;j'ai de la veine aujourd'hui !&lt;/strong&gt; 🎣&lt;/p&gt;

&lt;p&gt;Étonnamment, j'aperçois au loin un bateau : c'est le premier pêcheur que je croise qui se balade de nuit, avec la brume qui est tombée sur la crique...&lt;/p&gt;

&lt;p&gt;De toute façon je n'ai pas le temps de traîner : je dois vendre mon poisson et dormir, il se fait tard. Sur le retour, j'évite de justesse un rocher — ce voile de brouillard est étouffant, on n'y voit pas à 10 mètres ! Je devrai peut-être acheter un meilleur projecteur afin d'y voir plus clair .&lt;/p&gt;

&lt;p&gt;Malheureusement, à quelques encablures du port, je heurte un rocher qui vient d'apparaître sous mon nez. Il bousille mon moteur… Heureusement, on est arrivé.&lt;/p&gt;

&lt;p&gt;Le moteur encore toussotant me permet d'aller amarrer mon bateau. Il va vraiment falloir un meilleur projecteur — et plus urgent encore, réparer ma turbine !&lt;/p&gt;




&lt;h2&gt;
  
  
  🔧 Quel chantier ce raffiot !
&lt;/h2&gt;

&lt;p&gt;Je rends donc visite à la dame qui s'occupe du &lt;strong&gt;chantier naval&lt;/strong&gt;. Elle me propose de réparer mon bateau et d'acheter un nouveau moteur pour aller plus vite.&lt;/p&gt;

&lt;p&gt;J'accepte et j'installe donc le tout : cela prend un peu de place dans ma cale, mais s'il me permet d'aller voir des îles plus lointaines, ça en vaudra sans doute le coup.&lt;/p&gt;

&lt;p&gt;On m'a dit qu'autour de l'île il y avait beaucoup d'&lt;strong&gt;épaves échouées&lt;/strong&gt;. Je fais donc un tour pour voir ce qu'il en est et si je ne peux pas en tirer quelques trésors ou du moins des matériaux.&lt;br&gt;&lt;br&gt;
Je pourrais utiliser ces matériaux afin d'&lt;strong&gt;améliorer mon navire&lt;/strong&gt;. ⚙️&lt;/p&gt;




&lt;h2&gt;
  
  
  🕯️ Les abysses ont des secrets
&lt;/h2&gt;

&lt;p&gt;Je découvre une &lt;strong&gt;stèle&lt;/strong&gt; avec un renfoncement dans lequel est gravé un poisson.&lt;br&gt;&lt;br&gt;
Je remplis donc parfaitement le renfoncement avec les restes de ma pêche qui traînaient encore dans ma cale. Pendant quelques instants, rien ne se passe... Puis la stèle se met soudainement à s'illuminer d'une étrange &lt;strong&gt;lueur rouge&lt;/strong&gt;... &lt;/p&gt;

&lt;p&gt;Je vois ensuite sortir de l'eau et s'élever un étrange objet. Celui-ci vient s'encastrer à l'endroit où j'avais précédemment mis mon poisson.&lt;br&gt;&lt;br&gt;
Il s'agissait vraisemblablement d'une &lt;strong&gt;canne à pêche&lt;/strong&gt;, laquelle je m'empresse de récupérer. Je n'en avais jamais vu de telle.&lt;br&gt;&lt;br&gt;
Il faudra que j'améliore la cale de mon bateau afin de pouvoir l'installer et l'essayer.&lt;/p&gt;

&lt;p&gt;Plus tard, en mer, je repêche parfois des &lt;strong&gt;bouteilles dérivant&lt;/strong&gt; au hasard des vagues.&lt;br&gt;&lt;br&gt;
Dedans, les histoires d’autres marins perdus...&lt;br&gt;&lt;br&gt;
Peut-être qu’un jour, moi aussi, j’en laisserai une. &lt;/p&gt;




&lt;h2&gt;
  
  
  🌊 Au rythme des marées
&lt;/h2&gt;

&lt;p&gt;Ce jeu a un rythme bien à lui : le temps &lt;strong&gt;ne passe que lorsque tu te déplaces&lt;/strong&gt; — mais à vitesse constante (que tu fonces ou que tu lambines).&lt;/p&gt;

&lt;p&gt;La nuit tombée, la brume envahit la mer et il est urgent de rentrer. Plus on passe de temps dans le brouillard, plus on devient la proie aux hallucinations : des rochers surgissent, des monstres attaquent le bateau... 👁️&lt;/p&gt;

&lt;p&gt;Chaque sortie en mer devient donc un &lt;strong&gt;pari&lt;/strong&gt; entre temps, distance, et ce que tu espères ramener.&lt;/p&gt;

&lt;p&gt;Les améliorations de ton bateau permettent deux choses :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;te déplacer plus vite (et donc parcourir plus de distance dans la journée),&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;et augmenter la place disponible dans ta cale, libérant de l'espace pour du matériel de pêche perfectionné ou plus de poissons.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;J'ai adoré ce rythme lent. Le jeu prend son temps et te permet de prendre le tien pour parcourir son monde.&lt;br&gt;&lt;br&gt;
Loin d'être immense, il réserve pourtant de nombreuses surprises, histoires et trésors.&lt;/p&gt;

&lt;p&gt;Les mécaniques n'ont rien de révolutionnaire, mais le jeu leur donne la place qu'elles méritent et se distingue grâce à sa narration : dialogues, ambiance, atmosphère. 🎭&lt;/p&gt;

&lt;p&gt;Les développeurs ne se sont pas contentés d'un monde en ruine. Certaines îles sont habitées, d'autres détruites, et parfois des forces obligent les habitants à fuir vers d'autres parties de l'archipel.&lt;/p&gt;

&lt;p&gt;J'ai parcouru ces mers il y a maintenant un an, et les souvenirs de cette expérience restent &lt;strong&gt;très positifs&lt;/strong&gt;, même après les avoir mûris tout ce temps.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌫️ Le brouillard au-delà du jeu
&lt;/h2&gt;

&lt;p&gt;J'ai mis énormément de temps à écrire cet article. Pas tant parce que c'est difficile, mais parce que cela prend du temps et que je voulais rendre un travail à la hauteur de l'expérience que m'a permis de vivre ce jeu.&lt;/p&gt;

&lt;p&gt;J'ai mûri cette expérience pendant près d'un an, et j'espère que de cet article transparaîtra au moins un peu de l'amour que j'ai eu pour ce jeu — peut-être juste assez pour te convaincre de l'essayer .&lt;br&gt;&lt;br&gt;
👉 Il est disponible sur &lt;a href="https://www.gog.com/en/game/dredge" rel="noopener noreferrer"&gt;GOG&lt;/a&gt; et si tu es intéressé, je pense que c'est mieux de l'acheter là-bas (pas forcément plus cher, et sans DRM).&lt;/p&gt;

&lt;p&gt;Au-delà de ça, le jeu a résonné avec moi. Plus le temps passe, plus ça se confirme : je suis très facilement dispersé dans mes projets.&lt;br&gt;&lt;br&gt;
À l'instar du pêcheur de ce jeu, je me perds régulièrement dans le brouillard au milieu d'un océan de possibilités sans le phare d'un objectif.&lt;/p&gt;

&lt;p&gt;Il est important de savoir &lt;strong&gt;définir un objectif&lt;/strong&gt; à chaque aventure comme à chaque sortie en mer. Mais parfois ce n'est pas possible — dans le jeu comme dans la vie. Tu ne sais pas toujours ce que tu vas découvrir, et il faut savoir accepter cette incertitude.&lt;/p&gt;

&lt;p&gt;Même si j'ai du mal à me détacher de mes plans, il faudra bien que j'apprenne à lâcher prise quand c'est nécessaire... si je veux mener mes projets à bon port. &lt;/p&gt;

&lt;p&gt;Peut-être bientôt je te lancerai une bouteille à ce sujet.&lt;br&gt;&lt;br&gt;
En attendant, porte-toi bien, suis la lumière de ton phare… et si tu es perdu dans le brouillard, pas de panique : il finit toujours par se lever.&lt;/p&gt;

</description>
      <category>dredge</category>
      <category>videogame</category>
      <category>pêche</category>
      <category>fr</category>
    </item>
    <item>
      <title>Le markdown, de quoi on parle ?</title>
      <dc:creator>RoyS122</dc:creator>
      <pubDate>Fri, 18 Jul 2025 16:19:50 +0000</pubDate>
      <link>https://dev.to/roys122/le-markdown-de-quoi-on-parle--56an</link>
      <guid>https://dev.to/roys122/le-markdown-de-quoi-on-parle--56an</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.roys-dev.fr%2Fpost%2F0illustration_markdown.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.roys-dev.fr%2Fpost%2F0illustration_markdown.webp" alt="Illustration" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Je commence à écrire cet article sur le format Markdown, assez ironiquement, dans un avion… avec Google Keep (qui n’est évidemment &lt;strong&gt;pas&lt;/strong&gt; un éditeur Markdown).&lt;/p&gt;

&lt;p&gt;M’enfin, passons. Pour commencer, voici une courte histoire du Markdown.&lt;/p&gt;

&lt;h2&gt;
  
  
  Une histoire de Markdown
&lt;/h2&gt;

&lt;p&gt;Comme expliqué dans plusieurs archives de blogs (comme &lt;a href="http://www.aaronsw.com/weblog/001189" rel="noopener noreferrer"&gt;celle-ci&lt;/a&gt;), ce langage est né de l'imagination d'&lt;a href="https://fr.wikipedia.org/wiki/Aaron_Swartz" rel="noopener noreferrer"&gt;&lt;strong&gt;Aaron Swartz&lt;/strong&gt;&lt;/a&gt; et a été implémenté en Perl par &lt;a href="https://daringfireball.net/" rel="noopener noreferrer"&gt;&lt;strong&gt;John Gruber&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.roys-dev.fr%2Fpost%2Faaron-swartz.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.roys-dev.fr%2Fpost%2Faaron-swartz.webp" alt="Photo de Aaron Swartz" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Photo de Aaron Swartz lors d'une rencontre Wikipedia en 2009&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Aaron Swartz, écrivain, informaticien, activiste, a participé à de nombreux projets majeurs :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;le célébrissime &lt;strong&gt;flux RSS&lt;/strong&gt;,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;la &lt;strong&gt;licence Creative Commons&lt;/strong&gt;,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;et évidemment le projet Markdown pour lequel vous me lisez aujourd’hui.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dès son plus jeune âge, Swartz est concerné par une éducation libre, gratuite et collaborative. Il participe à l’élaboration du &lt;strong&gt;format RSS 1.0&lt;/strong&gt;… à seulement &lt;strong&gt;14 ans&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Il se suicide en 2013 à l’âge de 26 ans. Plusieurs sources avancent que son &lt;strong&gt;syndrome dépressif&lt;/strong&gt; et/ou le &lt;strong&gt;procès fédéral&lt;/strong&gt; pour "fraude électronique" (suite au téléchargement massif du catalogue JSTOR depuis le MIT) y seraient liés.&lt;/p&gt;

&lt;p&gt;Auteur du livre &lt;em&gt;"Celui qui pourrait changer le monde"&lt;/em&gt;, il est considéré comme une figure emblématique de la lutte pour la diffusion libre du savoir. Il sera même nommé au "Temple de la renommée d'Internet", dans la catégorie &lt;strong&gt;Innovateur&lt;/strong&gt;, aux côtés de Linus Torvalds (créateur du noyau Linux et de Git, rien que ça…).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.roys-dev.fr%2Fpost%2FJohn-Gruber.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.roys-dev.fr%2Fpost%2FJohn-Gruber.webp" alt="Photo de John Gruber" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;John Gruber The Talk Show – WWDC 2024&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;John Gruber, de son côté, est un développeur et auteur américain, connu pour son blog &lt;a href="https://daringfireball.net/" rel="noopener noreferrer"&gt;Daring Fireball&lt;/a&gt;. Il y écrit à propos de technologie, souvent sur Apple, avec une audience de passionnés de tech et de développeurs.&lt;/p&gt;

&lt;p&gt;Il anime aussi un podcast très écouté : &lt;strong&gt;The Talk Show&lt;/strong&gt;, produit par 5by5.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;✍️ &lt;em&gt;En écrivant cette partie sur l’histoire du Markdown, je me rends compte que faire des articles sur des personnalités tech serait sûrement une bonne idée… Il y a tant à dire, et je suis obligé de survoler des sujets très denses.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Qu’est-ce que le Markdown et pourquoi l’utiliser ?
&lt;/h2&gt;

&lt;p&gt;Bon, maintenant qu’on sait qui a créé cette chose, à quoi est ce que ça peut bien servir ?&lt;/p&gt;

&lt;p&gt;Est-ce qu’on n’a pas mieux à faire que de coller des étoiles au milieu de nos textes pour mettre des mots en gras ?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Et bien non, justement.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Markdown&lt;/strong&gt;, c’est un format de fichier un peu spécial :&lt;br&gt;&lt;br&gt;
C’est du &lt;strong&gt;texte brut&lt;/strong&gt; accompagné de &lt;strong&gt;caractères spéciaux&lt;/strong&gt; qui servent de balises (comme en HTML).&lt;/p&gt;

&lt;p&gt;L’idée : pouvoir structurer un document &lt;strong&gt;comme en HTML&lt;/strong&gt;, mais de manière beaucoup plus légère, &lt;strong&gt;lisible à l’œil nu&lt;/strong&gt;, et surtout facilement &lt;strong&gt;portable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Prenons un exemple simple :&lt;br&gt;&lt;br&gt;
Voici comment écrire du &lt;strong&gt;gras&lt;/strong&gt; ou de l’&lt;em&gt;italique&lt;/em&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gs"&gt;**ceci est en gras**&lt;/span&gt;  
&lt;span class="ge"&gt;*ceci est en italique*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Un lien ?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://openai.com&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Une liste ?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; Item 1
&lt;span class="p"&gt;-&lt;/span&gt; Item 2
&lt;span class="p"&gt;  -&lt;/span&gt; Sous-item
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Et un titre :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Titre H1&lt;/span&gt;
&lt;span class="gu"&gt;## Titre H2&lt;/span&gt;
&lt;span class="gu"&gt;### Titre H3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sur ce site, j’écris mes articles &lt;strong&gt;au format Markdown&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Le fichier est ensuite &lt;strong&gt;compressé&lt;/strong&gt;, stocké dans une base de données, puis à l’affichage, il est &lt;strong&gt;décompressé&lt;/strong&gt;, &lt;strong&gt;converti en HTML&lt;/strong&gt;, et &lt;strong&gt;envoyé au navigateur&lt;/strong&gt; (le client — aka toi, cher lecteur assidu).&lt;/p&gt;

&lt;p&gt;Sur les plateformes comme &lt;strong&gt;GitHub&lt;/strong&gt; ou &lt;strong&gt;GitLab&lt;/strong&gt;, les fichiers Markdown sont utilisés quasi systématiquement pour écrire les fichiers &lt;code&gt;README.md&lt;/code&gt;, qui servent de documentation aux projets open source. Ces plateformes proposent une &lt;strong&gt;prévisualisation native&lt;/strong&gt; du rendu final.&lt;/p&gt;

&lt;p&gt;Exemple :&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/torvalds/linux" rel="noopener noreferrer"&gt;GitHub - torvalds/linux: Linux kernel source tree&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Comment on écrit en Markdown ?
&lt;/h2&gt;

&lt;p&gt;On accède au point qui &lt;strong&gt;motive&lt;/strong&gt; la création de ce contenu!&lt;/p&gt;

&lt;p&gt;Je t'expliquai dans le &lt;a href="https://blog.roys-dev.fr/post/d73cb543-03de-435a-b38e-b8510fd7c5c2" rel="noopener noreferrer"&gt;précédent article&lt;/a&gt; (dans lequel je te parlais de ce blog et te faisais part de quelques notes d'intentions) que je comptais acceuillir d'autres auteurs sur ce blog cet article à pour vocation de servir de porte d'entrée au markdown de manière à ce qu'ils ne soient pas perdu.&lt;/p&gt;

&lt;p&gt;Voici une table très simple des balises principales :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Élément&lt;/th&gt;
&lt;th&gt;Syntaxe Markdown&lt;/th&gt;
&lt;th&gt;Résultat rendu&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gras&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;**gras**&lt;/code&gt; ou &lt;code&gt;__gras__&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;gras&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Italique&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;*italique*&lt;/code&gt; ou &lt;code&gt;_italique_&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;em&gt;italique&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lien&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[texte](url)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://url/" rel="noopener noreferrer"&gt;texte&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image&lt;/td&gt;
&lt;td&gt;&lt;code&gt;![alt](https://blog.roys-dev.fr/post/url)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Titre H1 à H6&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;#&lt;/code&gt;, &lt;code&gt;##&lt;/code&gt;, … &lt;code&gt;######&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;# Titre, ## Sous-titre…&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Liste à puces&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;-&lt;/code&gt; ou &lt;code&gt;*&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;• item&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Liste numérotée&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;1.&lt;/code&gt;, &lt;code&gt;2.&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;1. item&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bloc de code&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;\&lt;/code&gt;&lt;code&gt;lang&amp;nbsp;&amp;nbsp;\&lt;/code&gt;&lt;code&gt;\&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Un bloc de code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Citation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;gt; citation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&amp;gt; citation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Séparation&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;---&lt;/code&gt; ou &lt;code&gt;***&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;---&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;❓Notez que beaucoup de balises HTML sont souvent supportées par les compilateurs markdown.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Tu connais Markwhen ?
&lt;/h2&gt;

&lt;p&gt;Ok, maintenant que je vous ai parlé en détails du Markdown, passons en vitesse sur &lt;strong&gt;Markwhen&lt;/strong&gt; car il mérite mention.&lt;/p&gt;

&lt;p&gt;Pour rester concis, &lt;em&gt;ce n'est pas le sujet de l'article&lt;/em&gt;, le langage est grandement (et ouvertement) inspiré du langage qui fait titre de cet article. Il permet d'écrire une liste de dates à afficher sous forme de calendrier ou de frise chronologique.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Exemple d’un bloc Markwhen :&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2024-01-01: Début du projet
2024-03-15: Lancement beta
2024-07-01: Release publique
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;C’est un tout jeune langage (moins de 4 ans au moment où j’écris), mais je pense qu’il a un &lt;strong&gt;vrai potentiel&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;✍️ Je vous en reparlerai sûrement, car j’ai prévu de &lt;strong&gt;créer la roadmap du site via ce langage&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Liste d’éditeurs Markdown
&lt;/h2&gt;

&lt;p&gt;Voici quelques éditeurs recommandés pour écrire en Markdown :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://obsidian.md/" rel="noopener noreferrer"&gt;&lt;strong&gt;Obsidian&lt;/strong&gt;&lt;/a&gt; : éditeur puissant avec graphes de notes, très utilisé pour le &lt;strong&gt;PKM&lt;/strong&gt; (personal knowledge management).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/marktext/marktext" rel="noopener noreferrer"&gt;&lt;strong&gt;MarkText&lt;/strong&gt;&lt;/a&gt; : simple, open-source.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Visual Studio Code&lt;/strong&gt;&lt;/a&gt; avec extension &lt;em&gt;Markdown All in One&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://typora.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;Typora&lt;/strong&gt;&lt;/a&gt; : très élégant, orienté écriture.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://zettlr.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Zettlr&lt;/strong&gt;&lt;/a&gt; : académique, citation &amp;amp; bibliographie intégrée.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://hackmd.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;HackMD&lt;/strong&gt;&lt;/a&gt; : collaboratif en ligne.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pour conclure
&lt;/h2&gt;

&lt;p&gt;Pour finir cet article je voudrai que vous reteniez que le markdown est un langage de prise de note / de redaction qui permet d'intégrer la &lt;strong&gt;mise en page&lt;/strong&gt; de manière simple et &lt;strong&gt;rapide&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>markdown</category>
      <category>story</category>
      <category>fr</category>
      <category>format</category>
    </item>
    <item>
      <title>Devlog - 1: Je créé un moteur de jeu !</title>
      <dc:creator>RoyS122</dc:creator>
      <pubDate>Thu, 12 Sep 2024 08:38:02 +0000</pubDate>
      <link>https://dev.to/roys122/devlog-1-je-cree-un-moteur-de-jeu--3678</link>
      <guid>https://dev.to/roys122/devlog-1-je-cree-un-moteur-de-jeu--3678</guid>
      <description>&lt;h2&gt;
  
  
  Je crée un moteur de jeu!
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Introduction à cette grande aventure
&lt;/h3&gt;

&lt;p&gt;Depuis quelques semaines maintenant je travaille régulièrement sur un projet qui je pense peut être intéressant à raconter, la création de mon moteur de jeux vidéos en JavaScript et HTML5 basé sur les &lt;em&gt;canvas&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Tu te demande sûrement pourquoi avoir choisi HTML5 et JavaScript pour créer des jeux vidéos? La réponse est moins cool que la question, c'est le concourt de projets nécessaires pour mon école (Zone01 Normandie) et le fait que les langages ont tout le nécessaire pour mener à bien ce projet qui m'as mené à choisir ces technologies.&lt;/p&gt;

&lt;p&gt;Mais effectivement ce n'est pas les langages que j’aurais choisi de base et je me lancerai sûrement dans d'autres aventures de ce type avec des langages différents après la finalisation de celle-ci.&lt;/p&gt;

&lt;h3&gt;
  
  
  L'architecture
&lt;/h3&gt;

&lt;p&gt;Je me suis donc mis au travail pour concevoir mon moteur de jeux vidéos, il sera composé de plusieurs classes dont au moins deux principales: La classe Game qui permettra de gérer toute la zone de jeu et la classe GameObject  permet de générer les objets de notre jeux et les faire interagir entre eux.&lt;/p&gt;

&lt;p&gt;A ces classes j'ajouterai la classe CollideBox qui me permettra de gérer les boites de collision de tous les objets.&lt;/p&gt;

&lt;p&gt;La classe Game a une méthode GameLoop qui va s'exécuter à chaque frame(image) du jeu, une méthode Draw qui sera elle appeler à chaque boucle de jeu.&lt;/p&gt;

&lt;p&gt;Quand à la classe GameObject elle a une méthode Step, et une méthode Draw. &lt;br&gt;
La première s'exécute à chaque tour de boucle de jeu et la seconde à chaque appelle de la méthode Draw de la classe GameLoop.&lt;/p&gt;

&lt;p&gt;Cela permet donc en important le module Engine dans un projet de pouvoir théoriquement créer des jeux.&lt;br&gt;
Pour l'affichage des sprites je choisi d'utiliser l’API canva qui est built-in à HTML5 (built-in signifie qu'elle viens avec par défaut)&lt;br&gt;
Elle me permettra d'afficher tous les sprites et de redécouper les images afin de créer des animations ce qui me sera extrêmement utile!&lt;/p&gt;

&lt;p&gt;Après plusieurs jours j'arrive à afficher des animations, à une vitesse donnée, à détecter des collisions via mes CollideBox.&lt;br&gt;
Et plein d'autres choses sympathiques que je vous laisse zyeuter ci-dessous:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;La classe GameObject&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GameObject&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// Initialize the GameObject&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; 
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;col&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;row&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fh&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;step&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;anim_speed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loaded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;kill&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;collision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CollideBox&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gObjects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nf"&gt;setSprite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;img_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;col&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;speed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;scale&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;image loaded&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;col&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;col&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;row&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;col&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fh&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;step&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;anim_speed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onSpriteLoaded&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;img_path&lt;/span&gt;


    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nf"&gt;onSpriteLoaded&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="nf"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// Draw function of game object&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;


            &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;column&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;col&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;col&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

           &lt;span class="c1"&gt;// context.clearRect(this.x, this.y, this.sprite_img.fw, this.sprite_img.fh);&lt;/span&gt;
            &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fw&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;column&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fh&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fh&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fw&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fh&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scale&lt;/span&gt;
            &lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;anim_speed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// Mise à jour de step seulement à 12 fps&lt;/span&gt;
                &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;col&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sprite_img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nf"&gt;distance_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;collide_with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;box&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;box&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nx"&gt;GameObject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;box&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;box&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;collision&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;collision&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;box&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;box&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;collision&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;collision&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;box&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;collision&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;box&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;box&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;collision&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;collision&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;box&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;
          &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nf"&gt;onStep&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;   &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;   
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;La classe Game&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Game&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;700&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gObjects&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toLoad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;timers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;layers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementsByTagName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;canvas&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;width&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;height&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2d&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globalCompositeOperation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;source-over&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;inputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mouse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;keydown&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;keyup&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mousemove&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mouse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mouse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mouseevent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nf"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clearRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;heigh&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gObjects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gObjects&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nf"&gt;gLoop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;fps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;clock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;clock&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gObjects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

                &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gObjects&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gObjects&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;kill&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gObjects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;splice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                        &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gObjects&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;onStep&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;


            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;clock&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
               &lt;span class="c1"&gt;// context.l();&lt;/span&gt;

           &lt;span class="c1"&gt;//     console.log(clock)&lt;/span&gt;

           &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fps&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;clock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;clock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
           &lt;span class="p"&gt;}&lt;/span&gt; 

        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;fps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nf"&gt;keyboard_check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Il y a très certainement beaucoup d'erreurs d'optimisation ou autre mais le tout est bien fonctionnel, &lt;br&gt;
"Parfait!" me direz vous ?&lt;br&gt;
Ce serait bien trop simple.&lt;/p&gt;

&lt;h3&gt;
  
  
  Les soucis
&lt;/h3&gt;

&lt;p&gt;Après avoir fini cela et commencé à tâter le terrain pour la création d'un jeu avec ce moteur, j’apprends au détour d'une conversation avec un collègue une terrible nouvelle.&lt;/p&gt;

&lt;p&gt;J'imagine que tu te rappelle bien que les choix de technologie faits l'ont été pour correspondre aux exigences de mon école Zone01…&lt;br&gt;
Et bien en effet les langages choisi étaient bons mais je n'avais pas connaissance d'une consigne qui va très sérieusement handicaper le projet…&lt;br&gt;
Nous avions interdiction d'utiliser la librairie canva !&lt;/p&gt;

&lt;p&gt;Pour rappel c'est la librairie qui nous sert à afficher nos images.&lt;/p&gt;

&lt;h3&gt;
  
  
  La suite ?
&lt;/h3&gt;

&lt;p&gt;Au moment où j'écris ce texte je commence en parallèle à reprendre complètement la conception de ce moteur de jeu, sans l'utilisation de canva.&lt;/p&gt;

&lt;p&gt;Ce devlog est terminé pour et vous aurez la suite de cette histoire bientôt ne vous inquiétez pas.&lt;br&gt;
Pour le prochain devlog j’essaierai certainement un nouveau format.&lt;/p&gt;

&lt;p&gt;En espérant que ce contenu t'ai plus, divertis ou tout du moins instruit sur quelques sujets. Je te souhaite une bonne fin de journée et bon code.&lt;/p&gt;

&lt;h2&gt;
  
  
  DevLogs 1.1: Le moteur est terminé, comment ça fonctionne ?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Précédemment
&lt;/h3&gt;

&lt;p&gt;Il y a quelques mois j'ai commencé à créer mon moteur de jeux vidéos, je l'ai terminé... Il y a un bon moment même, et avec l'aide de plusieurs collègues de Zone01 nous avons même réussi à créer un jeu inspiré de Super Mario Bros disponible sur ma page Itch.io.&lt;/p&gt;

&lt;p&gt;La décision du format à appliquer pour ce devlog à pris beaucoup de temps, et je l'avoue j'ai légèrement temporisé voir même complétement repoussé l'échéance la rédaction de celui ci.&lt;br&gt;
En prenant patemment l'excuse de mon indécision pour ne pas travailler ce sujet, je me retrouve maintenant deux mois après la date de sortie prévue à écrire dans l'espace de repos de la gare routière de Rouen alors que mon train annulé m'oblige à attendre une heure supplémentaire.&lt;/p&gt;

&lt;p&gt;Fis donc de tous les détails de l'architecture, celle ci n'ayant que peu changer (hormis l'adaptation en évitant l'utilisation des canvas) depuis la première partie de mon devlog.&lt;br&gt;
Nous allons donc parler du projet réalisé, de la manière dont nous avons travaillé en équipe et des problèmes que nous avons rencontré.&lt;br&gt;
Voyez cela comme un retour d'expérience sur ce projet, et j'espère que vous parviendrai à tirer de cette rédaction quelques enseignements qui vous aiderons sur un de vos projet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Le projet
&lt;/h3&gt;

&lt;p&gt;Le projet était de recréer un Super Mario Bros en JavaScript et en partant de zéro, tout du moins pour ce qui est du code.&lt;/p&gt;

&lt;p&gt;Le cahier des charges était simple, nous devions avoir un jeu mario avec plusieurs niveau, une manière d'en créer de nouveaux simplement.&lt;br&gt;
Aussi nous devions créer un tableau des scores et un menu afin de régler les options.&lt;/p&gt;

&lt;p&gt;Les difficultés de ce projet étaient : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Le défilement horizontal des éléments à l'écran&lt;/li&gt;
&lt;li&gt;L'optimisation des éléments n'étants pas présent à l'écran&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le défilement car il requiert que tous les éléments défile en arrière plan relativement à la position du joueur.&lt;br&gt;
Et l'optimisation des éléments qui ne sont pas affiché à l'écran permet de réduire les ressources nécessaires à faire fonctionner le jeu sans perte de performance.&lt;/p&gt;

&lt;p&gt;Après avoir résolus ces difficultés nous avons publié ce jeu sur ma page &lt;a href="https://rexgame.itch.io/jameson-snake" rel="noopener noreferrer"&gt;itch.io&lt;/a&gt; sur laquelle même vous pouvez aller le tester.&lt;/p&gt;

&lt;p&gt;Voila comment se termine ce devlog, maintenant terminé je vais pouvoir écrire sur d'autres projets et/ou d'autres sujets.&lt;/p&gt;

&lt;p&gt;Si tu es même un petit peu intéressé par ce que je te raconte, tu peux aller voir mes différents projets (Dont ceux de ce devlog) sur &lt;a href="https://github.com/RoyS122" rel="noopener noreferrer"&gt;github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Bonne fin de journée!&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>html</category>
    </item>
  </channel>
</rss>
