complet.html 66 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <title>jdll-2024-godot</title>
  5. <meta name="generator" content="Etherpad">
  6. <meta name="author" content="Etherpad">
  7. <meta name="changedby" content="Etherpad">
  8. <meta charset="utf-8">
  9. <style>
  10. * {
  11. font-family: arial, sans-serif;
  12. font-size: 13px;
  13. line-height: 17px;
  14. }
  15. ul.indent {
  16. list-style-type: none;
  17. }
  18. ol {
  19. list-style-type: none;
  20. padding-left: 0;
  21. }
  22. body > ol {
  23. counter-reset: first second third fourth fifth sixth seventh eighth ninth tenth eleventh twelfth thirteenth fourteenth fifteenth sixteenth;
  24. }
  25. ol > li:before {
  26. content: counter(first) ". ";
  27. counter-increment: first;
  28. }
  29. ol > ol > li:before {
  30. content: counter(first) "." counter(second) ". ";
  31. counter-increment: second;
  32. }
  33. ol > ol > ol > li:before {
  34. content: counter(first) "." counter(second) "." counter(third) ". ";
  35. counter-increment: third;
  36. }
  37. ol > ol > ol > ol > li:before {
  38. content: counter(first) "." counter(second) "." counter(third) "." counter(fourth) ". ";
  39. counter-increment: fourth;
  40. }
  41. ol > ol > ol > ol > ol > li:before {
  42. content: counter(first) "." counter(second) "." counter(third) "." counter(fourth) "." counter(fifth) ". ";
  43. counter-increment: fifth;
  44. }
  45. ol > ol > ol > ol > ol > ol > li:before {
  46. content: counter(first) "." counter(second) "." counter(third) "." counter(fourth) "." counter(fifth) "." counter(sixth) ". ";
  47. counter-increment: sixth;
  48. }
  49. ol > ol > ol > ol > ol > ol > ol > li:before {
  50. content: counter(first) "." counter(second) "." counter(third) "." counter(fourth) "." counter(fifth) "." counter(sixth) "." counter(seventh) ". ";
  51. counter-increment: seventh;
  52. }
  53. ol > ol > ol > ol > ol > ol > ol > ol > li:before {
  54. content: counter(first) "." counter(second) "." counter(third) "." counter(fourth) "." counter(fifth) "." counter(sixth) "." counter(seventh) "." counter(eighth) ". ";
  55. counter-increment: eighth;
  56. }
  57. ol > ol > ol > ol > ol > ol > ol > ol > ol > li:before {
  58. content: counter(first) "." counter(second) "." counter(third) "." counter(fourth) "." counter(fifth) "." counter(sixth) "." counter(seventh) "." counter(eighth) "." counter(ninth) ". ";
  59. counter-increment: ninth;
  60. }
  61. ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > li:before {
  62. content: counter(first) "." counter(second) "." counter(third) "." counter(fourth) "." counter(fifth) "." counter(sixth) "." counter(seventh) "." counter(eighth) "." counter(ninth) "." counter(tenth) ". ";
  63. counter-increment: tenth;
  64. }
  65. ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > li:before {
  66. content: counter(first) "." counter(second) "." counter(third) "." counter(fourth) "." counter(fifth) "." counter(sixth) "." counter(seventh) "." counter(eighth) "." counter(ninth) "." counter(tenth) "." counter(eleventh) ". ";
  67. counter-increment: eleventh;
  68. }
  69. ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > li:before {
  70. content: counter(first) "." counter(second) "." counter(third) "." counter(fourth) "." counter(fifth) "." counter(sixth) "." counter(seventh) "." counter(eighth) "." counter(ninth) "." counter(tenth) "." counter(eleventh) "." counter(twelfth) ". ";
  71. counter-increment: twelfth;
  72. }
  73. ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > li:before {
  74. content: counter(first) "." counter(second) "." counter(third) "." counter(fourth) "." counter(fifth) "." counter(sixth) "." counter(seventh) "." counter(eighth) "." counter(ninth) "." counter(tenth) "." counter(eleventh) "." counter(twelfth) "." counter(thirteenth) ". ";
  75. counter-increment: thirteenth;
  76. }
  77. ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > li:before {
  78. content: counter(first) "." counter(second) "." counter(third) "." counter(fourth) "." counter(fifth) "." counter(sixth) "." counter(seventh) "." counter(eighth) "." counter(ninth) "." counter(tenth) "." counter(eleventh) "." counter(twelfth) "." counter(thirteenth) "." counter(fourteenth) ". ";
  79. counter-increment: fourteenth;
  80. }
  81. ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > li:before {
  82. content: counter(first) "." counter(second) "." counter(third) "." counter(fourth) "." counter(fifth) "." counter(sixth) "." counter(seventh) "." counter(eighth) "." counter(ninth) "." counter(tenth) "." counter(eleventh) "." counter(twelfth) "." counter(thirteenth) "." counter(fourteenth) "." counter(fifteenth) ". ";
  83. counter-increment: fifteenth;
  84. }
  85. ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > li:before {
  86. content: counter(first) "." counter(second) "." counter(third) "." counter(fourth) "." counter(fifth) "." counter(sixth) "." counter(seventh) "." counter(eighth) "." counter(ninth) "." counter(tenth) "." counter(eleventh) "." counter(twelfth) "." counter(thirteenth) "." counter(fourteenth) "." counter(fifteenth) "." counter(sixteenth) ". ";
  87. counter-increment: sixteenth;
  88. }
  89. ol {
  90. text-indent: 0px;
  91. }
  92. ol > ol {
  93. text-indent: 10px;
  94. }
  95. ol > ol > ol {
  96. text-indent: 20px;
  97. }
  98. ol > ol > ol > ol {
  99. text-indent: 30px;
  100. }
  101. ol > ol > ol > ol > ol {
  102. text-indent: 40px;
  103. }
  104. ol > ol > ol > ol > ol > ol {
  105. text-indent: 50px;
  106. }
  107. ol > ol > ol > ol > ol > ol > ol {
  108. text-indent: 60px;
  109. }
  110. ol > ol > ol > ol > ol > ol > ol > ol {
  111. text-indent: 70px;
  112. }
  113. ol > ol > ol > ol > ol > ol > ol > ol > ol {
  114. text-indent: 80px;
  115. }
  116. ol > ol > ol > ol > ol > ol > ol > ol > ol > ol {
  117. text-indent: 90px;
  118. }
  119. ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol {
  120. text-indent: 100px;
  121. }
  122. ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol {
  123. text-indent: 110px;
  124. }
  125. ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol {
  126. text-indent: 120px;
  127. }
  128. ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol {
  129. text-indent: 130px;
  130. }
  131. ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol {
  132. text-indent: 140px;
  133. }
  134. ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol {
  135. text-indent: 150px;
  136. }
  137. h1{font-size: 2.0em;line-height: 120%;} h2{font-size: 1.5em;line-height: 120%;} h3{font-size: 1.17em;line-height: 120%;} h4{line-height: 120%;} h5{font-size: 0.83em;line-height: 120%;} h6{font-size: 0.75em;line-height: 120%;} code{font-family: monospace;}
  138. </style>
  139. </head>
  140. <body>
  141. <h1>Faire un jeu avec le Godot Engine</h1><br><br><h2>Orga</h2><br><br><ul class="bullet"><li>Laisser les parties son &#224; Nomys</li><li>Nomys sera plus dispo &#224; partir de mercredi</li><li>Jovial fonce sur le guide le plus possible<ul class="bullet"><li>Ajustements sur le jeu dans un second temps</ul></li></ul><br><h2>Le jeu</h2><br><br>Le d&#233;p&#244;t git : <a href="https&#x3a;&#x2F;&#x2F;gogs&#x2e;jovian&#x2d;hersemeule&#x2e;eu&#x2F;DricomDragon&#x2F;RaquetteFracassante" rel="noreferrer noopener">https:&#x2F;&#x2F;gogs.jovian-hersemeule.eu&#x2F;DricomDragon&#x2F;RaquetteFracassante</a><br><br><h2>Le guide</h2><br><br><h3>Introduction</h3><br><br><h4>Principe de l&#x27;atelier</h4><br><br><ul class="bullet"><li>Projet starter.<ul class="bullet"><li>Le projet qui servira de base &#224; l&#x27;atelier est un casse brique classique qui s&#x27;appelle Raquette Fracassante.</li><li>Chaque niveau doit &#234;tre compl&#233;t&#233; en cassant toutes les briques &#224; l&#x27;&#233;cran gr&#226;ce &#224; une balle qui acc&#233;l&#232;re &#224; chaque rebond. Il faut ainsi renvoyer la balle de plus en plus vite avec la raquette tout en visant les briques &#224; casser.</li><li>Le jeu comporte des pouvoirs bonus qui pourront &#234;tre d&#233;bloqu&#233; en r&#233;cup&#233;rant les capsules qui tombent de certaines briques une fois celles-ci d&#233;truites.</ul></li></ul>Attention aux briques qui n&#233;cessitent d&#x27;&#234;tre frapp&#233;es plusieurs fois !<br><br>Le projet sera disponible en deux versions permettant aux personnes pr&#233;sentes lors de l&#x27;atelier d&#x27;orienter leur d&#233;couverte du Godot Engine :<br><ul class="bullet"><li>Version <strong>architecte</strong> : Parcours conception de niveaux (le jeu est complet, il faut juste ajouter de nouveaux niveaux)<ul class="bullet"><li>Cela permet de d&#233;couvrir l&#x27;interface du Godot Engine en douceur et d&#x27;utiliser des fonctionnalit&#233;s simples. On pourra produire en peu de temps un r&#233;sultat testable sur le champs et apprendre ainsi en s&#x27;amusant.</ul><li>Version <strong>artisan</strong> : Parcours construction du jeu (le jeu contient uniquement des fonctionnalit&#233;s minimales et tout le reste est &#224; faire soi-m&#234;me)<ul class="bullet"><li>On va pouvoir ainsi ajouter divers types de fonctionnalit&#233;s (interface, visuels, audio ou gameplay) et appr&#233;hender la fa&#231;on dont les fonctionnalit&#233;s d&#233;pendent les unes des autres. Par exemple pour ajouter un &#233;cran de victoire ou de d&#233;faite (&#233;l&#233;ment d&#x27;interface), il faut d&#x27;abord que le jeu sache quand est-ce qu&#x27;on gagne ou qu&#x27;on perd (fonctionnalit&#233; de gameplay).</li><li>Vous &#234;tes libres de faire les &#233;tapes dans l&#x27;ordre que vous voulez, mais attention aux d&#233;pendances ! Rep&#233;rez vous gr&#226;ce &#224; la carte fournie.</ul></li></ul><br>Image : carte des d&#233;pendances<br><br>Note : Afin que le chacun et chacune puisse ici s&#x27;y retrouver, nous pr&#233;senteront les fonctionnalit&#233;s par domaine et par niveau de difficult&#233;. Ainsi m&#234;me les d&#233;butants vont pouvoir ajouter des fonctionnalit&#233;s qui les int&#233;ressent &#224; notre casse-brique minimaliste.<br><br><h5>Décommenter le code</h5><br><br>Il y aura du code d&#233;j&#224; pr&#233;sent &#224; d&#233;commenter dans les scripts. Essayez de comprendre chaque bout de code vous-m&#234;me.<br><br>Les commentaires en Godot commencent avec #. Raccourci pour d&#233;commenter les lignes selectionn&#233;es : Ctrl + K.<br><br>Note : les commentaires doubles ## sont des commentaires sp&#233;ciaux dits de documentation (docstrings). Il ne faut pas les d&#233;commenter ! Le texte associ&#233; est visible dans l&#x27;&#233;diteur.<br><br><h4>Description de Godot</h4><br><br><ul class="bullet"><li>Def moteur de jeu<ul class="bullet"><li>Un <strong>moteur de jeu</strong> est un ensemble de composants logiciels qui effectuent des calculs de g&#233;om&#233;trie et de physique utilis&#233;s dans les jeux vid&#233;o. L&#x27;ensemble forme un simulateur en temps r&#233;el souple qui reproduit les caract&#233;ristiques des mondes imaginaires dans lesquels se d&#233;roulent les jeux. Le but vis&#233; par un moteur de jeu est de permettre &#224; une &#233;quipe de d&#233;veloppement de se concentrer sur le contenu et le d&#233;roulement du jeu plut&#244;t que la r&#233;solution de probl&#232;mes informatiques. (Wikip&#233;dia)</ul></li></ul><br><ul class="bullet"><li>Avantages&nbsp; de Godot<ul class="bullet"><li>Rapidit&#233; et facilit&#233;s de cr&#233;ation et de prototypage (id&#233;al pour faire des game jam),</li><li>Beaucoup d&#x27;outils accessibles sans code,</li><li>GDScript (langage interne) facile &#224; lire pour les d&#233;butants et d&#233;butantes,</li><li>Possibilit&#233; de coder en C++ pour les d&#233;veloppeureuses (ou d&#x27;autres languages via des addons),</li><li>Biblioth&#232;que d&#x27;addons disponible dans le moteur directement,</li><li>Aide accessible directement dans le moteur,</li><li>Espace de travail modulaire pour s&#x27;adapter aux pr&#233;f&#233;rences de chacun et chacune,</li><li>Moteur complet au niveau des fonctionnalit&#233;s de base (2D, 3D, r&#233;seau, audio, UI).</ul><li>et inconv&#233;nients...<ul class="bullet"><li>Pas encore au niveau sur certains aspects tr&#232;s pointus (3D et gestion audio notamment).</ul></li></ul><br><h4>Éditeur Godot</h4><br><br><h4>Concepts Godot</h4><br><br><ul class="bullet"><li>N&#339;uds (d&#233;butant)<ul class="bullet"><li>Les n&#339;uds sont les briques de construction de bases de Godot. Ils sont agenc&#233;s sous forme d&#x27;arbres dont un n&#339;ud est la racine dont part ensuite des n&#339;uds enfants, des n&#339;uds petits-enfants et ainsi de suite. Chaque une arborescence de n&#339;uds constitue un **sc&#232;ne**. Les sc&#232;nes peuvent avoir un nombre variable de n&#339;uds suivant les besoins.</li><li>Les sc&#232;nes vont &#234;tre ce qui va &#234;tre sauvegarder dans les fichiers du projet sous la forme de fichiers terminant par l&#x27;extension &quot;.tscn&quot;. Enfin, les sc&#232;nes peuvent &#234;tre appeller les unes dans les autres, on dit alors qu&#x27;elle est instanci&#233;e</ul><li>Scripts (avanc&#233;)<ul class="bullet"><li>Permet de d&#233;crire les r&#232;gles et comportements que doivent suivre les n&#339;uds. Par exemple d&#233;placer la balle &#224; chaque image, &#233;clater une brique quand elle n&#x27;a plus de vie, ou changer de musique au chargement d&#x27;un niveau. Les scripts sont &#233;crits via l&#x27;&#233;diteur de code int&#233;gr&#233;, et permettent de d&#233;crire comment r&#233;agir aux &#233;v&#233;nements du jeu. Godot &#233;tant un moteur riche, il n&#x27;y a pas besoin d&#x27;&#233;crire beaucoup de texte pour faire fonctionner notre jeu. Pour qu&#x27;un script soit interpr&#233;t&#233; par Godot, il faut l&#x27;attacher &#224; un n&#339;ud, via l&#x27;&#233;diteur.</li><li>Definition <strong>variable</strong> : valeur qui peut changer en cours du temps, que nous pouvons lire ou &#233;crire depuis un script via son nom (exemple : boolean a_perdu_vie ; Vector2 direction_rebond).<ul class="bullet"><li>Une variable attach&#233;e au n&#339;ud s&#x27;appelle <strong>propri&#233;t&#233;</strong> ou attribut (exemple : Vector2 position pour un Node2D).</li><li>Une variable qui est une entr&#233;e d&#x27;une fonction s&#x27;appelle un <strong>argument</strong></ul><li>Definition <strong>fonction</strong> : bout de script associ&#233; &#224; un nom qui est ex&#233;cut&#233; quand on l&#x27;appelle.<ul class="bullet"><li>Une fonction attach&#233;e &#224; un n&#339;ud s&#x27;appelle aussi <strong>m&#233;thode</strong></li><li>Le nom d&#x27;une fonction doit contenir un verbe, car appeler une fonction c&#x27;est faire quelque chose.</ul><li>Pas &#224; pas : <a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;tutorials&#x2F;scripting&#x2F;gdscript&#x2F;gdscript&#x5f;basics&#x2e;html" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;tutorials&#x2F;scripting&#x2F;gdscript&#x2F;gdscript_basics.html</a></li><li>Bonnes pratiques<ul class="bullet"><li>Style : <a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;tutorials&#x2F;scripting&#x2F;gdscript&#x2F;gdscript&#x5f;styleguide&#x2e;html" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;tutorials&#x2F;scripting&#x2F;gdscript&#x2F;gdscript_styleguide.html</a></li><li>Typage (pour ceux qui savent coder) : <a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;tutorials&#x2F;scripting&#x2F;gdscript&#x2F;static&#x5f;typing&#x2e;html" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;tutorials&#x2F;scripting&#x2F;gdscript&#x2F;static_typing.html</a></ul></li></ul><li>H&#233;ritage<ul class="bullet"><li>Des scripts internes existent dans Godot, afin de coder les comportements des n&#339;uds existants. Au d&#233;but d&#x27;un script, on d&#233;signe de quel autre script on souhaite h&#233;riter, via le mot-clef `extends`. Le cas le plus commun est d&#x27;h&#233;riter un script interne &#224; Godot, mais on peut aussi h&#233;riter d&#x27;un de nos scripts d&#233;j&#224; existants. Lorsque nous h&#233;ritons d&#x27;un script, nous pouvons appeler toutes ses m&#233;thodes et acc&#233;der &#224; ses propri&#233;t&#233;s. Par exemple, un script qui h&#233;rite de Node2D peut modifier la propri&#233;t&#233; position, et ainsi d&#233;placer l&#x27;objet !<ul class="bullet"><li>Classe : une classe est un script qui a nom : `class_name Balle`. Quand on &#233;crit un script, on ne peut h&#233;riter que d&#x27;une classe. Heureusement, tous les scripts internes de Godot sont aussi des classes. :-)</li><li>Bonjour grand-p&#232;re : l&#x27;h&#233;ritage peut &#234;tre cumulatif. Si vous h&#233;ritez de Sprite2D, qui h&#233;rite lui-m&#234;me de Node2D, votre script poss&#232;de &#224; la fois les propri&#233;t&#233;s de Sprite2D (comme texture par exemple) et de Node2D (position).</ul></li></ul><li>Signaux (m&#233;dium)</ul>M&#233;canique id&#233;ale pour faire communiquer des n&#339;uds entre eux. Les signaux permettent d&#x27;envoyer des messages &#224; z&#233;ro, un ou plusieurs destinataires en m&#234;me temps. &#192; chaque &#233;mission de signal correspond l&#x27;ex&#233;cution d&#x27;une fonction pour tous les n&#339;uds connect&#233;s &#224; ce signal. Les n&#339;uds de la biblioth&#232;que offrent des signaux et des fonctions d&#233;j&#224; utilisables, et il est possible d&#x27;en cr&#233;er dans nos scripts.<br><ul class="bullet"><li><ul class="bullet"><li>Pas &#224; pas : <a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;getting&#x5f;started&#x2F;step&#x5f;by&#x5f;step&#x2F;signals&#x2e;html" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;getting_started&#x2F;step_by_step&#x2F;signals.html</a></li><li>Utiliser un signal dans un script : <a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;tutorials&#x2F;scripting&#x2F;gdscript&#x2F;gdscript&#x5f;basics&#x2e;html&#x23;signals" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;tutorials&#x2F;scripting&#x2F;gdscript&#x2F;gdscript_basics.html#signals</a></li><li>R&#233;f&#233;rence : <a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;classes&#x2F;class&#x5f;signal&#x2e;html" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;classes&#x2F;class_signal.html</a></ul><li>Espace<ul class="bullet"><li>Les objets 2D sont positionn&#233;s dans l&#x27;espace via deux coordonn&#233;s : x et y. Tr&#232;s souvent utilis&#233;es ensemble, ces coordonn&#233;es sont regroup&#233;es dans un m&#234;me objet : un vecteur. Dans Godot, les coordonn&#233;es sont en pixel (en 2D). Ici, l&#x27;&#233;cran est un carr&#233; de 420 pixels de c&#244;t&#233;. Si un n&#339;ud est positionn&#233; en x=0, y=0, il sera en haut &#224; gauche. S&#x27;il est en x=210, y=420, il sera au milieu tout en bas de l&#x27;&#233;cran.</li><li>Image : axes de l&#x27;&#233;cran</li><li>Comprendre les vecteurs : <a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;tutorials&#x2F;math&#x2F;vector&#x5f;math&#x2e;html" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;tutorials&#x2F;math&#x2F;vector_math.html</a></li><li>R&#233;f&#233;rence : Vector2 <a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;classes&#x2F;class&#x5f;vector2&#x2e;html" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;classes&#x2F;class_vector2.html</a></ul></li></ul><br><br><h3>Étapes</h3><br><br><h4>Lancer le jeu depuis l&#x27;éditeur</h4><br><br><ul class="bullet"><li>Actions<ul class="bullet"><li>D&#233;marrer l&#x27;ex&#233;cutable de Godot.</ul></li></ul>La fen&#234;tre de gestion des projets s&#x27;ouvre (importation, cr&#233;ation de nouveau projet, lancement de l&#x27;&#233;diteur, etc).<br><ul class="bullet"><li><ul class="bullet"><li>Importer l&#x27;un des projets de casse-brique fournis.</ul></li></ul>L&#x27;&#233;diteur s&#x27;ouvre automatiquement, sinon s&#233;lectionner le projet dans la liste et cliquer sur &quot;&#201;diter&quot;.<br><ul class="bullet"><li><ul class="bullet"><li>Pour d&#233;marrer le jeu via l&#x27;&#233;diteur, cliquer sur le bouton &quot;lecture&quot; situ&#233; en haut &#224; droite de l&#x27;&#233;cran (&#224; c&#244;t&#233; du bouton &quot;stop&quot; notamment).</ul></li></ul>Une nouvelle fen&#234;tre s&#x27;ouvre et le jeu d&#233;marre.<br><br><ul class="bullet"><li>Notion de sc&#232;ne principale</ul>Lorsqu&#x27;on d&#233;marre le jeu (via l&#x27;&#233;diteur ou un ex&#233;cutable), ce qui est d&#233;marrer est une sc&#232;ne dites &quot;principale&quot;, d&#233;finie dans l&#x27;&#233;diteur. Et c&#x27;est de cette sc&#232;ne que vont ensuite &#234;tre d&#233;marrer toutes les autres sc&#232;nes qui composent le jeu.<br><ul class="bullet"><li>Expliquer l&#x27;architecture des dossiers<ul class="bullet"><li>Les dossiers des deux projets sont organis&#233;s de mani&#232;re suivante&nbsp; :<ul class="bullet"><li>&quot;Composants&quot;, contient tous les composants qui une fois assembl&#233;s forment le jeu. On y trouve donc les sc&#232;nes, script, visuels et sons pour : les interfaces, les objets (balle, brique, capsule, ar&#232;ne, raquette, etc) et enfin les pouvoirs (balle de feu par exemple).</li><li>&quot;Effets&quot;, qui contient les &#233;vennements qui peuvent survenir en jeu. Pour l&#x27;instant le seul est l&#x27;&#233;clatement d&#x27;une brique quand elle a &#233;t&#233; frapp&#233; suffisament de fois par la balle.</li><li>&quot;Exec&quot;, qui contient les principales sc&#232;nes du jeu qui vont &quot;s&#x27;ex&#233;cuter&quot;. On y trouve la sc&#232;ne principale du jeu (&quot;game&quot;), une sc&#232;ne de gestion de la musique et deux dossiers. Le dossier &quot;choix&quot; contient les &#233;l&#233;ments relatifs &#224; l&#x27;&#233;cran de choix de niveau et &#224; son fonctionnement et le dossier &quot;niveaux&quot; qui contient des sc&#232;nes correspondante chacune &#224; un niveau du jeu.</li><li>&quot;Ressources&quot;, qui contient les musiques du jeu, ainsi que les textures utilis&#233;es.</ul><li>Concernant les fichiers hors dossiers :<ul class="bullet"><li>Nous avons les fichiers terminant par &quot;.svg&quot;, qui sont des images servant d&#x27;ic&#244;nes pour l&#x27;ex&#233;cutable du projet, ces fichiers ne sont pas utilis&#233; dans le jeu lui-m&#234;me.</li><li>&quot;project.godot&quot; est le fichier principale du projet pour l&#x27;&#233;diteur. C&#x27;est &#224; partir de ce fichier que l&#x27;&#233;diteur charge le projet pour qu&#x27;on puisse ensuite travailler dessus.</li><li>Les fichiers se terminant par &quot;.import&quot; sont des fichiers de configuration d&#x27;importation des visuels et sons cr&#233;er par le Godot Engine.</li><li>Les fichiers se terminant par &quot;.tres&quot; sont des fichiers textes qui permettent au Godot Engine de g&#233;rer diff&#233;rents types de donn&#233;es pour diff&#233;rents usages. Ici par exemple, &quot;default_bus_layout.tres&quot; sert &#224; g&#233;rer les flux audio dans le projet.</ul></li></ul></li></ul><br>Note : L&#x27;ensemble de ses fichiers et dossiers doivent &#234;tre &#233;dit&#233; dans le l&#x27;&#233;diteur de Godot et non directement via le navigateur de fichiers<br><br><h4>Graphisme</h4><br><br>En bleu sur la carte.<br><br><h5>Changer l&#x27;image de la raquette</h5><br><br>Niv. 1<br><br>La raquette est un composant on va donc trouver la sc&#232;ne qui lui est d&#233;di&#233; dans le dossier &quot;composants&#x2F;objets&#x2F;raquette&quot;.<br>La sc&#232;ne est le fichier &quot;.tscn&quot; dans le dossier.<br><br><ul class="bullet"><li>Actions<ul class="bullet"><li>Double-cliquer sur le fichier &quot;raquette.tscn&quot; pour ouvrir la sc&#232;ne de la raquette.</ul></li></ul><br>La sc&#232;ne de la raquette est compos&#233;e de 3 n&#339;uds :<br>- Un n&#339;ud StaticBody2D,<br>- Un n&#339;ud Sprite2D,<br>- Un n&#339;ud CollisionShape2D.<br>C&#x27;est le n&#339;ud Sprite2D, d&#233;nomm&#233; &quot;image&quot;, qui va permettre l&#x27;affichage de l&#x27;image de la raquette.<br><br><ul class="bullet"><li>Actions<ul class="bullet"><li>Cliquer sur le n&#339;ud &quot;image&quot;.</ul></li></ul><br>Dans l&#x27;Inspecteur, on peut voir le champs &quot;Texture&quot;. C&#x27;est le contenu de ce champ qu&#x27;il faut modifier pour changer l&#x27;image de la raquette dans le jeu.<br><br>Avant de changer l&#x27;image, il ne faut pas oublier de mettre votre nouvelle image en .png dans le dossier &quot;composants&#x2F;objets&#x2F;raquette&quot;.<br><br><ul class="bullet"><li>Actions<ul class="bullet"><li>Pour modifier l&#x27;image, cliquer sur la fl&#232;che qui pointe vers le bas dans le champs &quot;Texture&quot; et choisir &quot;Charger&quot; pour pouvoir importer votre image.</li><li>Alternativement, faire un glisser-d&#233;poser entre votre fichier dans le dossier &quot;composants&#x2F;objets&#x2F;raquette&quot; dans le panneau &quot;Syst&#232;me de Fichier&quot; et l&#x27;image visible dans le champs &quot;Texture&quot; de l&#x27;Inspecteur.</ul></li></ul><br><h5>Changer la couleur de la raquette</h5><br><br>Niv. 1<br><br>La raquette est un composant on va donc trouver la sc&#232;ne qui lui est d&#233;di&#233; dans le dossier &quot;composants&#x2F;objets&#x2F;raquette&quot;.<br>La sc&#232;ne est le fichier &quot;.tscn&quot; dans le dossier.<br><br><ul class="bullet"><li>Actions<ul class="bullet"><li>Double-cliquer sur le fichier &quot;raquette.tscn&quot; pour oublir la sc&#232;ne de la raquette.</ul></li></ul><br>La sc&#232;ne de la raquette est compos&#233;e de 3 n&#339;uds :<br>- Un n&#339;ud StaticBody2D,<br>- Un n&#339;ud Sprite2D,<br>- Un n&#339;ud CollisionShape2D.<br>C&#x27;est le n&#339;ud Sprite2D, d&#233;nomm&#233; &quot;image&quot;, qui va permettre de changer la couleur de la raquette.<br><br><ul class="bullet"><li>Actions<ul class="bullet"><li>Cliquer sur le n&#339;ud &quot;image&quot;.</ul></li></ul><br>Dans l&#x27;Inspecteur, dans la section &quot;Visibility&quot;, on peut voir le champs &quot;Self-Modulate&quot;. C&#x27;est le contenu de ce champ qu&#x27;il faut modifier pour changer l&#x27;image de la raquette dans le jeu.<br><br><ul class="bullet"><li>Actions<ul class="bullet"><li>Cliquer sur le rectangle blanc pour acc&#233;der &#224; la palette de couleurs.</li><li>Choisir une couleur.</li><li>Cliquer en dehors de la fen&#234;tre du nuancier pour la faire disparaitre et valider la couleur choisie.</ul></li></ul><br>Note : vous pouvez aussi changer la valeur du champ &quot;Modulate&quot; du noeud racine `StaticBody2D`, ce qui change la couleur de tous les enfants, y compris l&#x27;image.<br><br><h5>Changer la couleur de la brique en fonction de sa vie</h5><br><br>Niv. 2<br><br>Il y a d&#233;j&#224; un d&#233;grad&#233; de noir gr&#226;ce &#224; l&#x27;&#233;tape pr&#233;c&#233;dente.<br><br>Alternatif : Essayer de modifier la fonction &quot;_montrer_nombre_vies&quot; le script &quot;brique.gd&quot; de la sc&#232;ne &quot;brique.tscn&quot; pour faire un d&#233;grad&#233; vers le rouge &#224; la place.<br><br><ul class="bullet"><li>Pr&#233;requis<ul class="bullet"><li>La brique a des vies</ul><li>Actions<ul class="bullet"><li>Chercher le dossier contenant les composants de la brique.</li><li>D&#233;commenter le code en rapport avec la vie de la brique dans le script &quot;brique.gd&quot;.</ul></li></ul><br>Note : Le script a comme premi&#232;re instruction @tool : cela signifie qu&#x27;il s&#x27;ex&#233;cute aussi dans l&#x27;&#233;diteur. Cela permet de voir le changement de couleur aussi dans l&#x27;&#233;diteur lorsque vous fabriquez un niveau.<br><br><h5>Faire une trainée à la balle</h5><br><br>Niv. 3<br><br><ul class="bullet"><li>Actions<ul class="bullet"><li>Trouvez le composant balle, ouvrez la sc&#232;ne qui se trouve dans le dossier.</li><li>Ajouter un GPUParticle2D dans la sc&#232;ne.</li><li>Dans l&#x27;inspecteur, remplir le champs &quot;Texture&quot; avec le png fournie dans le dossier &quot;effets&#x2F;trainee&quot;.</li><li>Toujours dans l&#x27;inspecteur, ajouter un nouveau &quot;Particule Process Material&quot; dans le champs &quot;Process Material&quot;.</ul><li>Ressources<ul class="bullet"><li>Texture de particule dans le dossier balle.</ul><li>Doc<ul class="bullet"><li>Pas &#224; pas : <a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;tutorials&#x2F;2d&#x2F;particle&#x5f;systems&#x5f;2d&#x2e;html" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;tutorials&#x2F;2d&#x2F;particle_systems_2d.html</a></li><li>R&#233;f&#233;rence (documentation brute) : <a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;classes&#x2F;class&#x5f;gpuparticles2d&#x2e;html" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;classes&#x2F;class_gpuparticles2d.html</a></ul></li></ul><br>Note : GPU signifie Graphical Process Unit, cela signifie que les particules sont calcul&#233;es avec le processeur graphique. Il est pr&#233;f&#233;rable de l&#x27;utiliser car plus performant ; cependant &#231;a ne marche pas sur toutes les machines. Auquel cas, on utilisera CPUParticles2D (<a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;classes&#x2F;class&#x5f;cpuparticles2d&#x2e;html&#x23;class&#x2d;cpuparticles2d&#x29;" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;classes&#x2F;class_cpuparticles2d.html#class-cpuparticles2d)</a>.<br><br><h5>Effet impact d&#x27;une balle</h5><br><br>Niv. 3<br><br><ul class="bullet"><li>Image : capture param&#233;trage effet de particule dans Kace</li><li>Actions<ul class="bullet"><li>Cr&#233;er un nouvel effet<ul class="bullet"><li>Dans le dossier &quot;effet&#x2F;impact&quot;, cr&#233;er une nouvelle sc&#232;ne.</li><li>Racine : Node2D &#x2F; Enfant : GPUParticles2D.</li><li>Configurer l&#x27;effet de particules en one shot dans l&#x27;Inspecteur.</li><li>Supprimer le n&#339;ud une fois que l&#x27;effet de particule est terminer via un signal.</ul><li>Cr&#233;er l&#x27;effet<ul class="bullet"><li>S&#x27;inspirer de l&#x27;effet d&#x27;&#233;clatement de la brique pour l&#x27;invocation de la sc&#232;ne d&#x27;impact dans le script &quot;brique.gd&quot;.<ul class="bullet"><li>const EclatementScene: PackedScene = preload(&quot;res:&#x2F;&#x2F;effets&#x2F;eclatement_brique&#x2F;eclatement_effet.tscn&quot;).</ul><li>Instancier la scene et l&#x27;ajouter &#224; l&#x27;arbre au moment du rebond dans le script de la balle.</ul></li></ul></li></ul><br><h5>Effet de flamme</h5><br><br>Niv. 3<br><br><ul class="bullet"><li>Action : modifier balle_de_feu.tscn<ul class="bullet"><li>Change l&#x27;image de la balle<ul class="bullet"><li>02.png</li><li>Reset les propri&#233;t&#233;s modulate et scale</li><li>Tester</ul><li>Diriger la balle en fonction de la direction<ul class="bullet"><li>Ajouter une fonction &quot;_diriger&quot; qui met &#224; jour l&#x27;orientation de la balle quand on l&#x27;appelle<ul class="bullet"><li>Utiliser la m&#233;thode angle_to pour r&#233;cup&#233;rer l&#x27;angle, par rapport &#224; une constante de Vector2 (Vector2.UP si la balle va vers le haut, Vector2.RIGHT si elle va vers la droite).</li><li>Modifier la rotation de l&#x27;image (propri&#233;t&#233; rotation)</ul><li>Appeler la fonction _diriger quand la balle se met en mouvement<ul class="bullet"><li>d&#233;commenter le code</ul><li>Appeler la aussi quand elle rebondit<ul class="bullet"><li>idem pour _rebondir que _mettre_en_mouvement</ul><li>Tester</ul><li>Clignoter : Changer la valeur de flip_h de l&#x27;image &#224; intervalle r&#233;gulier<ul class="bullet"><li>Utiliser $Image pour r&#233;cup&#233;rer le n&#339;ud qui s&#x27;appelle</li><li>Utiliser une variable globale pour compter le temps (ajouter delta &#224; chaque frame)</li><li>Utiliser une constante pour la dur&#233;e du clignotement</li><li>Pour calculer votre clignotement &#224; chaque image, mettez votre code dans la fonction _process</ul></li></ul><li>Doc<ul class="bullet"><li>R&#233;f AnimatedSprite2D#flip_v : <a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;classes&#x2F;class&#x5f;sprite2d&#x2e;html&#x23;class&#x2d;sprite2d&#x2d;property&#x2d;flip&#x2d;v" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;classes&#x2F;class_sprite2d.html#class-sprite2d-property-flip-v</a></ul></li></ul>&nbsp;<br>Note pour am&#233;liorer la performance : stocker la r&#233;f&#233;rence vers le n&#339;ud dans une variable pour &#233;viter de demander &#224; Godot de chercher le n&#339;ud &#224; chaque fois.<br>@onready image : Sprite2D = $Image<br><br><h5>Effet électrique</h5><br><br>Niv. 4<br><br><ul class="bullet"><li>Pr&#233;requis<ul class="bullet"><li>Pouvoir &#233;clair</ul><li>Ressources<ul class="bullet"><li>Texture de balle &#233;clair</ul><li>Actions<ul class="bullet"><li>Associer l&#x27;image &#233;clair au Sprite2D</li><li>S&#x27;inspirer de l&#x27;effet de flamme pour alterner les valeurs de frame, flip_h et flip_v &#224; intervalles r&#233;guliers.</li><li>Mode expert : alterner aussi avec&nbsp;</ul><li>Doc<ul class="bullet"><li>R&#233;f&#233;rence : AnimatedSprite2D <a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;classes&#x2F;class&#x5f;sprite2d&#x2e;html" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;classes&#x2F;class_sprite2d.html</a></ul></li></ul><br><h5>Effet de récupération de pouvoir</h5><br><br>Niv. 4<br><br><ul class="bullet"><li>Pr&#233;requis<ul class="bullet"><li>Sc&#232;ne pour l&#x27;effet de r&#233;cup : Bruit lors de r&#233;cup&#233;ration d&#x27;un pouvoir, alternative 2</ul><li>Ressources<ul class="bullet"><li>Animation de r&#233;cup&#233;ration de pouvoir</ul><li>Action<ul class="bullet"><li>Ajouter un n&#339;ud AnimatedSprite2D &#224; la sc&#232;ne `recup_pouvoir` dans le dossier `effets`</li><li>Attention : il ne faut d&#233;truire la sc&#232;ne avec queue_free quand le son et l&#x27;animation sont termin&#233;es !</ul><li>Documentation<ul class="bullet"><li>R&#233;f&#233;rence : <a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;classes&#x2F;class&#x5f;animatedsprite2d&#x2e;html" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;classes&#x2F;class_animatedsprite2d.html</a></ul></li></ul><br><h4>UI</h4><br><br>Interface utilisateur.<br><br><h5>Créer un menu d&#x27;accueil</h5><br><br>Sera d&#233;j&#224; fait, comme le menu pause.<br><br><h5>Afficher le compteur de balles</h5><br><br>Niv. 2<br><br><ul class="bullet"><li><s>Pr&#233;requis</s><ul class="bullet"><li><s>Nombre de balles dans le lanceur</s></ul><li>Actions<ul class="bullet"><li>D&#233;commenter la variable &quot;nombre_de_balles&quot; &#224; 0 dans la sc&#232;ne &quot;lanceur.tscn&quot;.&nbsp;</li><li>Ajouter signal &quot;nb_balles_change&quot; dans la sc&#232;ne du lanceur.<ul class="bullet"><li>&#201;mettez le signal dans l&#x27;appel &quot;_decrementer_nombre_de_balles()&quot;.</ul><li>Ajouter un label dans la sc&#232;ne de niveau.</li><li>Brancher le signal du&nbsp; lanceur du niveau vers le compteur&#x2F;label.<ul class="bullet"><li>R&#233;p&#233;ter le branchement pour chaque niveau.</ul></li></ul></li></ul><br>Note Si le label renvoie une erreur : &quot;Cannot convert argument 1 from int to String.&quot;, cela veut juste dire qu&#x27;il faut convertir la valeur de &quot;nombre_de_balles&quot; en String avant d&#x27;&#233;mettre le signal<br><br><br><h5>Afficher une jauge de balles</h5><br><br>Niv. 4 : naviguer la doc et exp&#233;rimenter<br><br>Remplacer le label par une jauge, dont le nombre de points repr&#233;sente le nombre de balles.<br><br><ul class="bullet"><li>Remplacer un control par un n&#339;ud plus avanc&#233; fourni par Godot</ul><br><h5>Afficher un écran de game over</h5><br><br>Niv. 1<br><br><ul class="bullet"><li>Action<ul class="bullet"><li>D&#233;commenter le signal &quot;partie_perdu&quot; dans la sc&#232;ne du lanceur.</li><li>L&#x27;&#233;mettre quand il n&#x27;y a plus de balle (fonction &quot;lancer_balle()&quot;).</li><li>Brancher dans chaque niveau :<ul class="bullet"><li>Le signal partie_perdue du lanceur vers le n&#339;ud &quot;Message&quot; et sa fonction &quot;show()&quot;.</li><li>Le signal partie_perdue du lanceur vers le n&#339;ud &quot;Message&#x2F;Perdu&quot; et sa fonction &quot;show()&quot;.</ul></li></ul></li></ul><br><h5>Afficher un écran de victoire</h5><br><br>Niv. 3 : beaucoup d&#x27;&#233;tapes<br><br><ul class="bullet"><li>Actions<ul class="bullet"><li>S&#x27;inspirer de l&#x27;&#233;cran de game over pour cr&#233;er l&#x27;&#233;cran de victoire.</li><li>Comprendre la logique de comptage des briques -&gt; code &#224; d&#233;commenter dans conteneur_briques.gd</li><li>Afficher le message dans chaque niveau<ul class="bullet"><li>Ajouter votre nouvelle sc&#232;ne en tant que n&#339;ud enfant de Message</li><li>Brancher le signal aux bonnes fonctions (montrer &#233;cran + d&#233;truire lanceur).</ul></li></ul></li></ul><br>Note : comme les balles cr&#233;&#233;es par le lanceur sont des n&#339;uds enfants, d&#233;truire le lanceur d&#233;truit aussi toutes les balles.<br><br><h5>Compter et afficher le score</h5><br><br>Niv. 4 : le&#183;a participant&#183;e se d&#233;brouille<br><br><h5>Pouvoir scroller les planètes</h5><br><br>Niv. 1<br><br><ul class="bullet"><li>Pr&#233;requis<ul class="bullet"><li>Sc&#232;ne &quot;choix_niveau.tscn&quot; qui permet d&#233;j&#224; de choisir un niveau.</ul><li>Actions<ul class="bullet"><li>Ajouter un n&#339;ud ScrollContainer dans la sc&#232;ne &quot;choix_niveau.tscn&quot;</li><li>Mettre le SystemeSolaire en tant qu&#x27;enfant de ce n&#339;ud.</li><li>Redimensionner le ScrollContainer pour qu&#x27;il prenne l&#x27;espace visible.<ul class="bullet"><li>Soit &#224; la main dans la vue 2D.</li><li>Soit dans l&#x27;Inspecteur, section &quot;Transform&quot;, champs &quot;Size&quot;, mettre les valeurs de X et Y &#224; 420.</ul></li></ul></li></ul><br><h5>Mécanique de pseudo</h5><br><br>Niv. 4 : le&#183;a participant&#183;e se d&#233;brouille<br><br>Idem leaderboard, afficher pseudo en jeu.<br><br><h4>Sons</h4><br><br>Bruitages et musique.<br><br><h5>Insérer une musique dans un niveau</h5><br><br>Niv. 1<br><br>Les AudioStreamPlayer sont les n&#339;uds permettant de jouer des sons, on peut les int&#233;grer dans tout types de sc&#232;nes et les manipuler avec des fonctions simples comme play() ou stop() par exemple. Il existe 3 AudioStreamPlayer, le simple (st&#233;r&#233;o), l&#x27;AudioStreamPlayer2D (qui g&#232;re l&#x27;audio positionnel en 2 dimensions) et l&#x27;AudioStreamPlayer3D (audio positionnel en 3 dimensions).<br><br><ul class="bullet"><li>Pr&#233;requis<ul class="bullet"><li>Musique dans le menu</ul><li>Actions<ul class="bullet"><li>Ajouter un n&#339;ud AudioStreamplayer dans la sc&#232;ne de niveau.</li><li>Charger la musique voulu dans le champs &quot;Stream&quot; de l&#x27;AudioStreamPlayer dans l&#x27;inspecteur.</li><li>Bien penser &#224; cocher `loop` pour les musiques import&#233;es !</li><li>Dans le champs Bus dans l&#x27;inspecteur, s&#233;lectionner : Musique</li><li>Cocher le champs &quot;Autoplay&quot;.</li><li>Enfin dans la section &quot;Process&quot; changer le champs &quot;Mode&quot; pour la valeur &quot;Always&quot; (sinon la musique se mettra en pause lors de l&#x27;affichage du menu pause.</ul><li>R&#233;f&#233;rence&nbsp;<ul class="bullet"><li>Le n&#339;ud AudioStreamPlayer : <a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;classes&#x2F;class&#x5f;audiostreamplayer&#x2e;html" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;classes&#x2F;class_audiostreamplayer.html</a></ul></li></ul><br><h5></h5><br><br><br><br><br><br><h5>Faire un bruit à l&#x27;impact d&#x27;une balle</h5><br><br>Niv 1<br><br><ul class="bullet"><li>Pr&#233;requis<ul class="bullet"><li>La brique fait un bruit en explosant</li><li>La balle avec un signal rebondi</ul><li>Actions<ul class="bullet"><li>Ajouter le noeud AudioStreamPlayer dans la scene balle.</li><li>Charger le son &quot;collision_sfx.wav&quot; dans le champs &quot;Stream&quot; de l&#x27;AudioStreamPlayer dans l&#x27;inspecteur.</li><li>Brancher le signal&nbsp; &quot;rebondi&quot; de la balle &#224; la fonction play() de l&#x27;AudioStreamPlayer.</li><li>Dans l&#x27;inspecteur de l&#x27;AudioStreamPlayer affecter le champs &quot;Bus&quot; au bus : Bruits</ul></li></ul><br><h5>Faire un bruit au clic sur bouton début</h5><br><br>Niv. 2<br><br><ul class="bullet"><li>Actions<ul class="bullet"><li>Ajout du son de clic bouton dans le Menu Pause :<ul class="bullet"><li>Ajouter un AudioStreamPlayer dans la sc&#232;ne &quot;pause_menu.tscn&quot;</li><li>Nommer l&#x27;AudioStreamPlayer : &quot;clic_sound&quot;.</li><li>Charger le son de clic dans le champs &quot;Stream&quot; de l&#x27;AudioStreamPlayer.</li><li>Dans le champs Bus dans l&#x27;inspecteur, s&#233;lectionner : Bruits</li><li>Ajouter &quot;get_node(&quot;clic_sound&quot;).play()&quot; dans les fonctions &quot;_quand_bouton_reprendre_est_presse()&quot;, &quot;_quand_bouton_retour_titre_est_presse()&quot; et &quot;_quand_bouton_quitter_est_presse()&quot; dans le script &quot;pause_menu.gd&quot;.</ul><li>Ajout du son de clic bouton sur les plan&#232;tes du Menu Principal :<ul class="bullet"><li>Ajouter un AudioStreamPlayer dans la sc&#232;ne &quot;choix_niveau.tscn&quot; en enfant du n&#339;ud &quot;DefilementNiveaux&quot;.</li><li>Nommer l&#x27;AudioStreamPlayer : &quot;clic_sound&quot;.</li><li>Charger le son de clic dans le champs &quot;Stream&quot; de l&#x27;AudioStreamPlayer.</li><li>Dans le champs Bus dans l&#x27;inspecteur, s&#233;lectionner : Bruits</li><li>Ajouter &quot;get_parent().get_parent().get_node(&quot;clic_sound&quot;).play()&quot; dans la fonction &quot;_quand_planete_est_cliquee()&quot; dans le script &quot;planete.gd&quot;.</ul></li></ul></li></ul><br><br><h5>Faire un bruit au game over</h5><br><br>Niv. 1<br><br><ul class="bullet"><li>Pr&#233;requis<ul class="bullet"><li>Sc&#232;ne de partie perdu : &quot;perdu.tscn&quot;.</ul><li>Actions<ul class="bullet"><li>Ajouter un noeud AudioStreamPlayer dans la sc&#232;ne &quot;perdu.tscn&quot;.</li><li>Charger le son de partie perdu (game over) dans le champs &quot;Stream&quot; de l&#x27;AudioStreamPlayer.</li><li>Dans le champs Bus dans l&#x27;inspecteur, s&#233;lectionner : Bruits</li><li>Brancher le signal &quot;visibility_changed()&quot; du n&#339;ud &quot;OhNon&quot; ou du n&#339;ud &quot;CommandeRetour&quot; sur la fonction play() de l&#x27;AudioStreamPlayer.</ul></li></ul><br><h5></h5><br><h5>Bruit lorsqu&#x27;un pouvoir est récupéré</h5><br><br>Niv. 1<br><br><ul class="bullet"><li>Pr&#233;requis<ul class="bullet"><li>Capsule impl&#233;ment&#233;e</ul><li>Actions<ul class="bullet"><li>Possibilit&#233; 1 : signal<ul class="bullet"><li>Ajouter un signal &quot;capsule_recuperee&quot;</li><li>&#201;mettre le signal</li><li>Ajouter noeud AudioStreamPlayer</li><li>Brancher le signal sur la fonction play() de l&#x27;AudioStreamPlayer</ul><li>Alternative 2 : son spatialis&#233; &#8658; effet graphique de r&#233;cup&#233;ration de pouvoir<ul class="bullet"><li>Cr&#233;er un effet : Cr&#233;er un nouveau dossier &quot;recup_pouvoir&quot; dans le dossier &quot;effets&quot;</li><li>Instancier un AudioStreamPlayer2D depuis le code (m&#234;me emplacement que le signal possibilit&#233; 1)</ul></li></ul></li></ul><br><br><h5>Effet audio dynamique : diminuer l&#x27;importance de la musique quand un effet sonore joue</h5><br><br>Niv. 2<br><br>Les bus audio sont des &quot;tubes virtuels&quot; dans lesquels on fait passer les flux audio. Ils sont visibles dans l&#x27;onglet &quot;Audio&quot; du panneau inf&#233;rieur de l&#x27;&#233;diteur. Par d&#233;faut il n&#x27;existe qu&#x27;un bus dit &quot;Master&quot; &#224; l&#x27;int&#233;rieur duquel le son circule de haut en bas, passant du contr&#244;leur de volume, aux effets &#233;ventuels pour finir par sortir via vos hauts-parleurs. De nouveaux bus peuvent &#234;tre ajout&#233;s facilement pour contenir les musiques, les effets sonores, les voix, etc et leur appliquer des traitements d&#233;di&#233;s.<br><br>Le compresseur est un effet audio complexe a utilis&#233; qui sert &#224; &#233;tablir un plancher au-dela duquel le volume sonore du son augmentera moins ou plus du tout. Cela va permettre ici de faire perdre en d&#233;finition la musique quand les effets sonores sont jou&#233;s afin que le joueur&#x2F;la joueuse dispose toujours des informations audio n&#233;cessaires pour jouer dans de bonnes conditions et que la musique ne couvre jamais les effets sonores.<br><br><ul class="bullet"><li>Pr&#233;requis<ul class="bullet"><li>Avoir deux bus, un bus &quot;Bruits&quot; pour les effets sonores et un bus &quot;Musique&quot; pour la musique.</ul><li>Actions<ul class="bullet"><li>Ajouter un effet &quot;Compressor&quot; (compresseur) dans le bus &quot;Musique&quot;.</li><li>R&#233;gler les param&#232;tres du compresseur dans l&#x27;Inspecteur comme suit :<ul class="bullet"><li>&quot;Threshold&quot; (seuil de d&#233;cibel &#224; partir duquel l&#x27;effet s&#x27;active) : -17.</li><li>&quot;Ratio&quot; (ratio de diminution du volume du son quand le compresseur est actif) : 1.8.</li><li>&quot;Release&quot; (temps pendant lequel le compresseur reste actif une fois le volume du son revenu sous le seuil) : 50 ms.</ul></li></ul></li></ul>En l&#x27;&#233;tat le compresseur s&#x27;active et agit quand le contenu du bus &quot;Musique&quot; voit son volume passer au-dessus du &quot;Treshold&quot;. Il faut changer cela, car on veut que le compresseur s&#x27;active quand les effets sonores joues (contenu du bus &quot;Bruits&quot;).<br><ul class="bullet"><li><ul class="bullet"><li><ul class="bullet"><li>Dans le champs &quot;Sidechain&quot; s&#233;lectionner le bus &quot;Bruits&quot;, cela va permettre au compresseur de s&#x27;activer quand le contenu du bus Bruits d&#233;passera le seuil, cependant le compresseur agira toujours sur le contenu du bus &quot;Musique&quot;. Ainsi la musique passera l&#233;g&#232;rement en fond quand les effets sonores seront jou&#233;s.</ul></li></ul></li></ul><br><br><h5>Effet audio dynamique sur le menu pause</h5><br><br>Niv. 3<br><br>Il faut ici passer par un peu de script pour piloter le bus &quot;Musique&quot; et activer l&#x27;un de ses effets.<br><br><ul class="bullet"><li>Actions<ul class="bullet"><li>Ajouter un effet &quot;LowPassFilter&quot; sur le bus &quot;Musique&quot; et laisser ses r&#233;glages par d&#233;faut.</li><li>D&#233;sactiver l&#x27;effet dans le bus (case &#224; d&#233;cocher) pour que l&#x27;effet soit &#233;teint au d&#233;marrage du jeu.</li><li>Ouvrir la sc&#232;ne &quot;pause_menu.tscn&quot; et passer la vue en mode script.</li><li>Rep&#233;rer dans le script &quot;pause_menu.gd&quot; la fonction &quot;_unhandled_input(event: InputEvent)&quot; et ajouter dans le &quot;else&quot; de l&#x27;embranchement : &quot;AudioServer.set_bus_effect_enabled(2,1, true)&quot;&nbsp; pour activer le &quot;LowPassFilter&quot; &#224; l&#x27;apparition du menu pause.</li><li>Rep&#233;rer dans le script &quot;pause_menu.gd&quot; la fonction &quot;reprendre()&quot; et ajouter &quot;AudioServer.set_bus_effect_enabled(2,1, false)&quot; pour d&#233;sactiver l&#x27;effet quand le menu pause se ferme.</ul><li>Documentation<ul class="bullet"><li>Manipuler les bus audio avec la classe AudioServer : <a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;classes&#x2F;class&#x5f;audioserver&#x2e;html&#x23;class&#x2d;audioserver&#x2d;method&#x2d;set&#x2d;bus&#x2d;effect&#x2d;enabled" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;classes&#x2F;class_audioserver.html#class-audioserver-method-set-bus-effect-enabled</a></ul></li></ul><br><br><br><br><h4>Exportation</h4><br><br><br><br><ul class="bullet"><li>Documentation<ul class="bullet"><li><a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;tutorials&#x2F;export&#x2F;exporting&#x5f;projects&#x2e;html" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;tutorials&#x2F;export&#x2F;exporting_projects.html</a></ul></li></ul><br><h4>Architecte</h4><br><br><h5>Modifier le niveau existant</h5><br><br>Niv. 1<br><br><ul class="bullet"><li>Actions<ul class="bullet"><li>Dans la vue 2D, configurer la grille (bouton &quot;Option d&#x27;aimantation&quot;) avec les valeurs suivantes :<ul class="bullet"><li>D&#233;calage : x = 30, y = 0.</li><li>Pas : x = 30 px, y = 16 px (taille d&#x27;une brique).</li><li>Ligne primaire tous les : x = 4 pas, et y = 8 pas.</ul><li>Dupliquer les n&#339;uds Brique pour en cr&#233;er de nouveaux et placer-les dans le niveau.</li><li>Changer les param&#232;tres de chaque brique ind&#233;pendament dans l&#x27;Inspecteur.</ul></li></ul><ul class="indent"><li>Image : editor_gd4_raquette_config_grille.png.</ul><br><h5>Créer un autre niveau</h5><br><br>Niv. 1<br><br><ul class="bullet"><li>Actions<ul class="bullet"><li>Dupliquer la sc&#232;ne d&#x27;un niveau.</li><li>Modifier le niveau existant.</li><li>Ajouter un niveau au menu :<ul class="bullet"><li>Aller dans la sc&#232;ne &quot;choix_niveau&quot;.</li><li>Dupliquer un n&#339;ud plan&#232;te.</li><li>Placer la nouvelle plan&#232;te dans un endroit vide du ciel &#233;toil&#233; dans la vue 2D.</li><li>Modifier le champ &quot;Niveau&quot; de la plan&#232;te dans l&#x27;Inspecteur pour choisir votre niveau.</li><li>Modifier le champs &quot;Normal&quot; de la section &quot;Texture&quot; pour changer l&#x27;image de la plan&#232;te.</ul></li></ul></li></ul><br><h4>Artisan</h4><br><br><h5>Faire descendre les briques au fil du temps</h5><br><br>Niv. 2<br><br>Compl&#232;tement facultatif.<br><br><ul class="bullet"><li>Actions<ul class="bullet"><li>Cr&#233;er un script qui h&#233;rite de &quot;ConteneurDeBriques&quot;.</li><li>Cr&#233;er une constante vitesse_de_descente := 5.0 # px&#x2F;sec.</li><li>Appliquer la descente &#224; chaque image (frame) via la fonction &quot;_physics_process&quot;.</ul></li></ul><br><h5>Faire perdre la partie si une brique sort du terrain</h5><br><br>Niv. 4<br><br><ul class="bullet"><li>Pr&#233;requis<ul class="bullet"><li>Les briques descendent au fil du temps.</ul><li>Actions<ul class="bullet"><li>Modifier l&#x27;ar&#232;ne pour que la zone du bas, appel&#233;e ZoneExterieure, d&#233;tecte les collisions avec les briques (collision_layer: mask)</li><li>Faire en sorte que l&#x27;ar&#232;ne envoit un signal quand une brique est d&#233;tect&#233;e par la zone ext&#233;rieure</li><li>Relier ce signal au m&#234;me signal que le game over classique</ul></li></ul><br><h5>Avoir un nombre limité de vies</h5><br><br>Niv. 2<br><br><ul class="bullet"><li>Actions<ul class="bullet"><li>Ouvrir le script du lanceur.</li><li>D&#233;commenter le code qui permet de configurer le nombre de balles via l&#x27;&#233;diteur.</li><li>&#201;crire une fonction &quot;_decrementer_nombre_de_balles() -&gt; void&quot;.<ul class="bullet"><li>Qui soustrait 1 au nombre de balles.</ul><li>Modifier la fonction &quot;lancer_balle&quot;.<ul class="bullet"><li>Rajouter un test, s&#x27;il n&#x27;y a plus de balle, arr&#234;ter la fonction avec le mot-clef &quot;return&quot;.</li><li>Note : &quot;return&quot; interrompt une fonction.</li><li>Astuce : afficher le nombre de balles apr&#232;s chaque d&#233;cr&#233;mentation avec une fonction &quot;print()&quot;</ul></li></ul></li></ul><br><h5>Faire accélérer la balle</h5><br><br>Niv. 2<br><br><ul class="bullet"><li>Actions<ul class="bullet"><li>Cr&#233;er, dans le script de la balle, une constante : &quot;acceleration_par_touche: float = 50.0 # px &#x2F; sec &#x2F; touche&quot;</li><li>Modifier la fonction &quot;_accelerer&quot; qui augmente la vitesse de la balle quand elle est appel&#233;e.<ul class="bullet"><li>Utiliser la constante pr&#233;c&#233;dente pour modifier la propri&#233;t&#233; vitesse de la balle.</li><li>Pour appliquer la nouvelle vitesse, vous devez aussi appeler la fonction &quot;_mettre_mouvement&quot;.</ul><li>Alternative 1 : acc&#233;lerer &#224; chaque touche de raquette.<ul class="bullet"><li>Dans &quot;_physics_process&quot; : Appeler &quot;_accelerer&quot; apr&#232;s chaque rebond sur une raquette.</li><li>Note : 50 px &#x2F; sec &#x2F; touche c&#x27;est bien pour avoir un bon challenge.</ul><li>Alternative 2 : acc&#233;lerer &#224; chaque rebond.<ul class="bullet"><li>Dans &quot;_physics_process&quot; : Appeler &quot;_accelerer&quot; apr&#232;s chaque rebond.</li><li>Note : 10 px &#x2F; sec &#x2F; touche c&#x27;est bien pour avoir un bon challenge.</ul></li></ul></li></ul><br><h5>Passer au niveau suivant une fois un niveau terminé</h5><br><br>Niv. 4<br><br>Attribut par niveau, script niveau.<br><br><h5>Pouvoir configurer le nombre de vies d&#x27;une brique</h5><br><br>Niv. 3<br><br><ul class="bullet"><li>Actions<ul class="bullet"><li>Modifier &quot;brique.gd&quot; comme suit :<ul class="bullet"><li>D&#233;commenter la constante &quot;NOMBRE_DE_VIES_MAX&quot;.</li><li>D&#233;commenter la variable &quot;nombre_de_vies&quot;.</li><li>Modifier la fonction &quot;frapper&quot; pour r&#233;duire les points de vie, et ne mourir que s&#x27;il n&#x27;en reste plus.</li><li>D&#233;commenter &quot;_montrer_nombre_de_vies&quot; et la fonction qui l&#x27;appelle.</ul><li>Modifier les niveaux pour ajuster la vie.<ul class="bullet"><li>Ouvrir le niveau carr&#233; simple.<ul class="bullet"><li>Mettre 4 vies au bloc central.<ul class="bullet"><li>Astuce : vous pouvez s&#233;lectionner plusieurs briques en les selectionnant.</li><li>La propri&#233;t&#233; nombre de vies est visible dans l&#x27;&#233;diteur gr&#226;ce au pr&#233;fixe &quot;@export&quot;.</ul></li></ul></li></ul></li></ul></li></ul><br>Note : quand vous modifiez la vie dans l&#x27;&#233;diteur, sa couleur change en direct ! Cela est possible gr&#226;ce &#224; l&#x27;annotation &quot;@tool&quot; en haut du script, qui permet de faire fonctionner le script dans l&#x27;&#233;diteur (&#224; utiliser avec pr&#233;caution) ; et la m&#233;thode &quot;set_nombre_de_vies&quot;, utilis&#233;e pour modifier le nombre de vie (set = set_nombre_de_vies), qui rafraichit la couleur de la brique d&#232;s que le nombre de points de vie est modifi&#233;.<br><br><h5>Faire un obstacle avec une nouvelle forme</h5><br><br>Niv. 3<br><br><ul class="bullet"><li>Actions<ul class="bullet"><li>Nouvelle sc&#232;ne de racine StaticBody2D.</li><li>Nouvelle forme (sph&#233;rique par exemple).</li><li>Texture que vous voulez (plan&#232;te par exemple).</li><li>Configurer les calques de collision.<ul class="bullet"><li>C&#x27;est un mur (cochez la case &quot;mur&quot; dans le damier &quot;collision_layer&quot;).</li><li>&#199;a collisionne avec les balles (cochez la case &quot;mur&quot; dans le damier &quot;collision_mask&quot;).</ul></li></ul><li>Calques de collision.<ul class="bullet"><li>Explications : <a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;tutorials&#x2F;physics&#x2F;physics&#x5f;introduction&#x2e;html&#x23;collision&#x2d;layers&#x2d;and&#x2d;masks" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;tutorials&#x2F;physics&#x2F;physics_introduction.html#collision-layers-and-masks</a></li><li>R&#233;f&#233;rence : <a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;classes&#x2F;class&#x5f;collisionobject2d&#x2e;html&#x23;class&#x2d;collisionobject2d&#x2d;property&#x2d;collision&#x2d;layer" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;classes&#x2F;class_collisionobject2d.html#class-collisionobject2d-property-collision-layer</a></ul></li></ul><br><h5>Faire une brique avec une nouvelle forme</h5><br><br>Niv. 4<br><br><ul class="bullet"><li>Actions<ul class="bullet"><li>Cr&#233;er un dossier &quot;brique_spherique&quot; (ou autre forme) dans le dossier brique.</li><li>Copier la sc&#232;ne de brique dans ce dossier et la renommer pour obtenir &quot;brique_spherique.tscn&quot;.</li><li>Modifier la forme et la texture pour l&#x27;accorder &#224; votre besoin.</li><li>L&#x27;ajouter au niveau de votre choix.</ul></li></ul><br>Note : comme votre nouvelle brique a le m&#234;me script que la brique de base, les deux ont le m&#234;me comportement !<br><br><h5>Collectibles qui donne des points</h5><br><br>Niv. 4<br><br><ul class="bullet"><li>Pr&#233;requis<ul class="bullet"><li>Compteur de score.</ul><li>Actions<ul class="bullet"><li>Cr&#233;er un pouvoir &quot;ScoreBonus&quot; (voir ci-dessous).</li><li>Associer un groupe &#224; votre compteur de score.</li><li>Incr&#233;menter le score quand le pouvoir est d&#233;clench&#233;.</ul></li></ul><br><h5>Pouvoir de ralentissement</h5><br><br>Niv. 3<br><br><ul class="bullet"><li>Pr&#233;requis<ul class="bullet"><li>Capsule qui permet de lib&#233;rer un pouvoir contenu dans une brique.</ul><li>Actions<ul class="bullet"><li>Ajouter un frein sur la balle.<ul class="bullet"><li>Ajouter la balle dans le &quot;groupe_des_balles&quot;.<ul class="bullet"><li>Voir : Avoir un nombre de vies limit&#233;.</ul><li>D&#233;commenter la m&#233;thode &quot;ralentir&quot;.</ul><li>Cr&#233;er un nouveau pouvoir.<ul class="bullet"><li>Copier le script &quot;bonjour_pouvoir.gd&quot; et le renommer en &quot;pouvoir_ralentir.gd&quot;.<ul class="bullet"><li>Changer le nom de la classe en &quot;RalentirPouvoir&quot;.</ul><li>Choisir la couleur en modifiant la valeur retourn&#233;e par &quot;couleur_principale&quot; (exemple : Color.WEB_GREEN).</li><li>Dans &quot;association_pouvoirs.gd&quot; :<ul class="bullet"><li>Ajouter le type de pouvoir dans l&#x27;&#233;num&#233;ration &quot;Type&quot;.</li><li>Associer votre script dans la fonction statique &quot;fabriquer&quot;.</ul><li>Facultatif : associer une texture de brique pour un type de pouvoir :<ul class="bullet"><li>les textures possibles sont dans le dossier &quot;composants&#x2F;objets&#x2F;brique&#x2F;images&#x2F;&quot;.</li><li>L&#x27;association est faite dans la &quot;methode _associe_texture_brique&quot; dans &quot;brique.gd&quot;.</ul><li>Associer votre nouveau pouvoir &#224; une brique dans un niveau.</li><li>&#201;crire l&#x27;effet du pouvoir dans &quot;declencher_pouvoir&quot;.</ul><li>&#201;crire l&#x27;effet du pouvoir dans &quot;declencher_pouvoir&quot; :<ul class="bullet"><li>Renommer l&#x27;argument &quot;_arbre_scene&quot; en &quot;arbre_scene&quot;.</li><li>Pour toutes les balles, appeler la m&#233;thode &quot;ralentir(3.0)&quot;.<ul class="bullet"><li>&#192; l&#x27;int&#233;rieur &#233;crire une boucle &quot;for&quot;, comme suit : &quot;for balle in arbre_scene.get_nodes_in_group(&quot;groupe_des_balles&quot;):&quot;</ul></li></ul></li></ul><li>Note : le pouvoir est fabriqu&#233; au moment o&#249; la capsule est lib&#233;r&#233;e, quand la brique est d&#233;truite.</li><li>Note : pr&#233;fixer un argument par &quot;_&quot; permet de dire &#224; Godot que c&#x27;est normal que l&#x27;argument ne soit pas utilis&#233;.</li><li>Documentation<ul class="bullet"><li>Un vecteur normalis&#233; a une longeur de 1 : <a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;classes&#x2F;class&#x5f;vector2&#x2e;html&#x23;class&#x2d;vector2&#x2d;method&#x2d;normalized" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;classes&#x2F;class_vector2.html#class-vector2-method-normalized</a></li><li>R&#233;f&#233;rence arbre des n&#339;uds : <a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;classes&#x2F;class&#x5f;scenetree&#x2e;html" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;classes&#x2F;class_scenetree.html</a></li><li>Explication d&#233;taill&#233;e du fonctionnement de l&#x27;arbre des n&#339;uds : <a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;tutorials&#x2F;scripting&#x2F;scene&#x5f;tree&#x2e;html" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;tutorials&#x2F;scripting&#x2F;scene_tree.html</a></ul></li></ul><br><h5>Pouvoir de vie&#x2F;balles supplémentaires</h5><br><br>Niv. 3<br><br><ul class="bullet"><li>Pr&#233;requis<ul class="bullet"><li>Pouvoir existant.</li><li>Affichage du nombre de balles restante.</ul><li>Actions<ul class="bullet"><li>Ajouter la fonction &quot;incrementer_nombre_de_balles&quot; dans le lanceur.<ul class="bullet"><li>N&#x27;oubliez pas d&#x27;&#233;mettre le signal &quot;nb_balles_change&quot; !</ul><li>Cliquer sur le n&#339;ud &quot;Lanceur&quot; dans un niveau, puis dans l&#x27;onglet n&#339;ud &#8594; groupes, l&#x27;ajouter au &quot;groupe_des_lanceurs&quot;<ul class="bullet"><li>Image : &quot;editor_gd4_raquette_ajout_groupe_des_lanceurs.png&quot;</ul><li>En d&#233;clenchant le pouvoir, r&#233;cup&#233;rer le lanceur via son groupe, et appeler la fonction &quot;incrementer_nombre_de_balles&quot;.<ul class="bullet"><li>Utiliser la fonction &quot;get_first_node_in_group()&quot;.</ul></li></ul><li>Documentation<ul class="bullet"><li>R&#233;f&#233;rence pour r&#233;cup&#233;rer un n&#339;ud d&#x27;un groupe : <a href="https&#x3a;&#x2F;&#x2F;docs&#x2e;godotengine&#x2e;org&#x2F;fr&#x2F;4&#x2e;x&#x2F;classes&#x2F;class&#x5f;scenetree&#x2e;html&#x23;class&#x2d;scenetree&#x2d;method&#x2d;get&#x2d;first&#x2d;node&#x2d;in&#x2d;group" rel="noreferrer noopener">https:&#x2F;&#x2F;docs.godotengine.org&#x2F;fr&#x2F;4.x&#x2F;classes&#x2F;class_scenetree.html#class-scenetree-method-get-first-node-in-group</a></ul></li></ul><br><h5>Pouvoir agrandissement raquette</h5><br><br>Niv. 4<br><br><ul class="bullet"><li>Actions<ul class="bullet"><li>Ajouter un pouvoir.</li><li>Mettre la raquette dans le groupe.</li><li>Ajouter une methode publique &quot;changer_taille&quot; pour modifier sa taille.<ul class="bullet"><li>&#x2F;!\ Il faut modifier la taille de l&#x27;image et la taille de l&#x27;enveloppe physique !</ul><li>Dans le d&#233;clenchement du pouvoir, appeler la methode &quot;changer_taille&quot; sur toutes les raquettes.</ul></li></ul><br><h5>Malus diminution taille de raquette</h5><br><br>Niv. 4<br><br><ul class="bullet"><li>Idem ci-dessus, modulo le facteur de taille.</ul><br><h5>Faire une carte de niveaux interactive</h5><br><br>Niv. 4<br><br><h5>Pouvoir de feu</h5><br><br>Niv. 3<br><br>Ici, lorsque le pouvoir sera activ&#233;, la (ou les) balle sera transform&#233;e en balle de feu. Cela signifie qu&#x27;il y a une sc&#232;ne d&#233;di&#233;e &#224; la balle de feu, qui existe et que vous pouvez regarder.<br><br><ul class="bullet"><li>S&#x27;inspirer du pouvoir de ralentissement pour faire le pouvoir<ul class="bullet"><li>Nom classe : &quot;PouvoirFeu&quot;.</li><li>Couleur : &quot;Color.RED&quot;.</ul><li>Actions<ul class="bullet"><li>D&#233;clenchement du pouvoir : comme pour le ralentissement, le pouvoir doit &#234;tre effectu&#233; sur toutes les balles.</li><li>Appeler la m&#233;thode statique &quot;BalleDeFeu.transformer(balle)&quot;.</ul></li></ul><br>Note : une m&#233;thode statique est une fonction qui peut &#234;tre appel&#233;e sans avoir &#224; cr&#233;er l&#x27;objet associ&#233;.<br><br><h5>Pouvoir laser</h5><br><br>Niv. 4<br><br><ul class="bullet"><li>Pr&#233;requis<ul class="bullet"><li>Assets graphiques javelot.</ul><li>Actions<ul class="bullet"><li>Faire un nouveau pouvoir</li><li>D&#233;clenchement : ajoute une sc&#232;ne temporaire, le javelot, qui part de la raquette, qui va vers le haut et qui d&#233;truit toutes les briques sur son passage</ul></li></ul><br><h5>Pouvoir électrique</h5><br><br>Niv. 4<br><br>La balle &#233;lectrique poss&#232;de une zone d&#x27;influence qui d&#233;truit les briques &#224; distance.<br><br><ul class="bullet"><li>Pr&#233;requis<ul class="bullet"><li>Image de la balle &#233;lectique (anim&#233;e dans un autre chapitre)</ul><li>Actions<ul class="bullet"><li>Copier la sc&#232;ne balle de feu.</li><li>Le pouvoir &#233;lectrique va fonctionner de mani&#232;re analogue au pouvoir de feu : lorsqu&#x27;il est d&#233;clench&#233;, toutes les balles sont transform&#233;e</li><li>La balle &#233;lectrique contient une Area2D qui va scanner les briques, et leur mettre des d&#233;g&#226;ts</li><li>Bonus : rajouter un d&#233;lai entre le moment o&#249; la zone &#233;lectrique touche une brique et le moment o&#249; celle-ci subit le d&#233;g&#226;t</ul><li>Docs<ul class="bullet"><li>R&#233;f&#233;rence Area2D :&nbsp;</li><li>R&#233;f&#233;rence Timer :&nbsp;</ul></li></ul><br><h5>Pouvoir balle collante</h5><br><br>Niv. 4<br><br>La balle colle &#224; la raquette, et peut &#234;tre renvoy&#233;e avec un clic ou un appui sur espace.<br><br><h5>Pouvoir balle spectrale</h5><br><br>Niv. 4<br><br>La balle spectrale devient transparente au contact sur la raquette : elle ne rentre pas en collision avec les briques, jusqu&#x27;&#224; son premier rebond contre un mur.<br><br><h5>Faire un nouveau pouvoir de balle</h5><br><br>Niv. 4<br><br>&#192; vous de l&#x27;imaginer, et de l&#x27;impl&#233;menter. :-)<br><br><br><br><br><br><br><br><strong>**Features test&#233;es :</strong><br>- Changer l&#x27;image de la raquette,<br>- Changer la couleur de la raquette,<br>- Changer la couleur de la brique en fonction de sa vie,<br>- Faire une train&#233;e &#224; la balle,<br>- Effet impact d&#x27;une balle (non r&#233;ussie),<br>- Afficher le compteur de balles,<br>- Afficher un &#233;cran de game over,<br>- Pouvoir scroller les plan&#232;tes,<br>- Ins&#233;rer une musique dans un niveau,<br>- Faire un bruit au game over,<br>- Modifier le niveau existant,<br>- Cr&#233;er un autre niveau,<br>- Avoir un nombre limit&#233; de vies (voir commentaire ci-dessous),<br>- Faire acc&#233;l&#233;rer la balle,<br>- Pouvoir configurer le nombre de vies d&#x27;une brique,<br>- Pouvoir de vie&#x2F;balles suppl&#233;mentaires (commenc&#233;, mais arr&#234;ter par<br>flemme).<br><br><strong>**Lignes du guide avec des soucis&#x2F;commentaires :&nbsp;</strong><br>194 - Manque le code &#224; d&#233;commenter dans la fonction frappe() de<br>brique.gd.<br>215 - j&#x27;y suis pas arriv&#233;, le node GPUParticule2D fait une erreur par<br>rapport au mat&#233;riau.<br>401 - &quot;Faire un bruit &#224; l&#x27;impact d&#x27;une balle&quot; = d&#233;j&#224; dans le projet<br>starter, soit on l&#x27;enl&#232;ve du guide, soit du projet starter. -&gt; On l&#x27;enl&#232;ve du projet<br>522 - &quot;Image : editor_gd4_raquette_config_grille.png&quot; = je ne sais pas<br>ce que &#231;a fait l&#224; -&gt; screenshot en attente<br>558 - Pour faire le compteur de balle, je suis aller copier-coller le<br>code dans le projet fini. Du coup pas besoin de suivre le guide sur<br>&quot;Avoir un nombre limit&#233; de vies&quot; -&gt; d&#233;pendances non respect&#233;es<br>594 - Pouvoir configurer le nombre de vies d&#x27;une brique = je suis aller<br>copier-coller le code dans le projet fini. Du coup pas besoin de suivre<br>le guide sur &quot;Avoir un nombre limit&#233; de vies&quot; -&gt; idem<br>694 - Le node Lanceur fait d&#233;j&#224; partie du groupe des lanceurs -&gt; &#224; enlever dans le starter<br><br><br>
  142. </body>
  143. </html>