= Apprendre à programmer avec Singe Scott Duensing :revnumber: 3.00 :revdate: 2026 :doctype: book :toc: left :toclevels: 3 :title-logo-image: image:singeLogo.png[Singe, pdfwidth=2.6in, align=center] :source-highlighter: rouge :icons: font :experimental: :imagesdir: ../images :lang: fr include::locale.adoc[] [preface] [#_before_you_begin] == Avant de commencer Ce livre vous apprend à programmer. Il part du principe que vous n'avez jamais écrit une ligne de code de votre vie, et il ne suppose pas que vous voulez devenir programmeur -- seulement que vous voulez faire un jeu. Chaque leçon se termine par quelque chose que vous pouvez lancer et avec quoi vous pouvez jouer. Rien n'est gardé pour plus tard : il n'y a pas de chapitres de théorie avant que la première image apparaisse à l'écran. Vous écrirez votre premier programme qui marche en une dizaine de minutes, et il fera cinq lignes. Singe est un moteur de jeu. Vous pouvez faire avec lui tout ce que vous pouvez faire avec n'importe quel autre moteur, en deux dimensions ou en trois, et l'essentiel de ce livre consiste à faire exactement cela. Ce qui le distingue, c'est qu'il sait aussi lire de la vidéo FMV (« full motion video ») comme monde dans lequel se déroule le jeu ; c'est ainsi que fonctionnaient les jeux laserdisc des salles d'arcade, et presque rien d'autre ne le fait bien. C'est une possibilité, pas une obligation : un jeu ne lit de la vidéo que s'il le demande, et rien de ce que vous écrirez pendant les treize premières leçons ne s'en approchera. Le langage est Lua, que Singe utilise pour tout. Lua a été choisi par des gens qui devaient l'enseigner à des artistes et à des designers, et ça se voit. Il n'y a pas de points-virgules à oublier, pas de types à déclarer, et pas de compilateur contre lequel se battre. Quand vous faites une erreur, Singe vous dit le fichier, la ligne, et ce qu'il n'a pas compris. [#_what_you_need] === Ce qu'il vous faut * *Singe.* Un seul fichier. Mettez-le dans un dossier, quelque part où vous saurez le retrouver. * *Un éditeur de texte.* Bloc-notes, TextEdit en mode texte brut, Notepad++, VS Code, ou n'importe quoi d'autre qui enregistre du texte brut. Un traitement de texte ne fera pas l'affaire : il enregistre une mise en forme que vous ne voyez pas, et Singe ne sait pas la lire. * *Rien d'autre.* Vous n'avez besoin ni d'un laserdisc, ni d'un fichier vidéo, ni d'un logiciel de dessin, ni d'aucune illustration. Toute la première partie dessine tout elle-même, et à partir de la deuxième partie, les images, les sons, la vidéo et les modèles dont vous avez besoin sont tous fournis avec le livre ou avec le moteur. Ce dont vous avez besoin est listé plus bas. [#_how_to_read_this_book] === Comment lire ce livre Tapez le code. Ne le copiez-collez pas. Le taper est plus lent, et c'est tout l'intérêt : vous ferez de petites erreurs, et c'est en les corrigeant que vous apprendrez à lire ce que l'ordinateur vous dit. Chaque leçon a une section *Essayez* avec des modifications à faire, et elles comptent autant que la leçon. Si une leçon tourne mal et que vous ne voyez pas pourquoi, le script terminé de chaque leçon se trouve dans le dossier `learn` fourni avec ce livre, nommé d'après sa leçon : `01-hello.singe`, et ainsi de suite. Ne le lisez qu'après avoir essayé. [#_how_your_folders_are_laid_out] === Comment vos dossiers sont organisés La leçon un met cela en place et toutes les leçons suivantes le supposent ; cela vaut donc la peine de le voir une fois dès maintenant. Vous gardez un *dossier de travail*, avec votre copie de Singe dedans. Chaque leçon crée un nouveau dossier à l'intérieur, nommé d'après le script qu'il contient. [literal] ---- singe/ <- votre dossier de travail, avec Singe dedans Singe/ <- le moteur y met ses propres fichiers data/ <- et tout ce que vos jeux enregistrent hello/ hello.singe rocks/ rocks.singe art/ ---- Vous lancez une leçon depuis le dossier de travail en nommant son dossier : `Singe rocks` lance donc `rocks/rocks.singe`. Cette forme courte marche parce que le dossier et le script portent le même nom. C'est la même forme qu'a un vrai jeu installé, et c'est pourquoi le livre l'utilise dès la première leçon au lieu de faire le ménage plus tard. [#_what_comes_with_this_book] === Ce qui est fourni avec ce livre À partir de la deuxième partie, les leçons utilisent des images et des sons. Ils se trouvent dans le dossier `art` fourni avec le livre, et vous copiez ce dossier dans le dossier de la leçon sur laquelle vous travaillez, en gardant son nom. Il y a un vaisseau, un rocher, un tir, une étoile, quatre images de quelqu'un qui marche, et deux bruits. `art/README.txt` les liste avec leurs tailles. Singe lui-même fournit le reste. La première fois que vous lancez quoi que ce soit, le moteur déballe un dossier appelé `Singe` dans votre dossier de travail, et on y trouve une vidéo, une police, deux modèles 3D et un clic. Les leçons qui en ont besoin utilisent ceux qui sont déjà sur votre disque ; il n'y a donc rien à chercher et rien à acheter. Rien de tout cela n'est joli. Tout est réel, et pour mettre quelque chose de mieux à la place, il suffit en général de changer un nom de fichier. [#_this_is_not_the_forge_book] === Ce n'est pas le livre de Forge Forge, un outil séparé qui a son propre livre, fait un jeu à partir d'une description au lieu de le programmer. C'est une autre route qui mène ailleurs, pour quelqu'un qui ne veut pas du tout écrire de code. Si vous êtes venu ici pour apprendre à programmer, vous êtes au bon endroit. Vous n'avez besoin ni de Forge ni de son livre, et celui-ci ne s'appuie pas dessus. La _Référence de Singe_ est la référence : chaque fonction, chaque argument, chaque valeur de retour, et le modèle de programmation qui est derrière. Ce n'est pas un tutoriel et elle n'essaie pas d'en être un. Vous commencerez à vous y reporter vers la leçon six, et à la fin de ce livre vous vous en servirez plus que de ce livre-ci. Elle vient dans le même téléchargement que celui-ci. [#_the_series] == La série Trente et une leçons en quatre parties. Chacune a besoin de la précédente, et de rien d'autre. *Première partie : les idées.* Pas d'illustrations, pas de vidéo, rien à installer. Vous dessinez avec les formes et le texte que le moteur a déjà, et vous apprenez de quoi est fait un programme. . *Bonjour* -- un script, une fonction, une chaîne, et quelque chose à l'écran. . *Des nombres qui changent* -- les variables, l'arithmétique, et faire bouger les choses. . *Prendre des décisions* -- `if`, les comparaisons, et lire les commandes. . *Recommencer* -- `for` et `while`, et dessiner cent fois la même chose. . *Vos propres fonctions* -- les arguments, les valeurs de retour, et pourquoi s'en donner la peine. . *Des listes de choses* -- les tables, `ipairs`, ajouter et retirer. . *Un jeu* -- tout ce qui précède, jouable, en cent vingt lignes environ. . *Quand ça tourne mal* -- lire les erreurs, `debugPrint`, et recharger avec F5. *Deuxième partie : un vrai jeu.* Des illustrations, du son, et la forme que prend un jeu terminé. [start=9] . *Des images* -- les sprites, le chargement, le dessin et les images d'animation. . *Le son* -- les effets, la musique, et quand charger quoi. . *Toucher des choses* -- les collisions, le kit de jeu, et les boîtes de collision. . *Score, vies et fin de partie* -- l'état, la sauvegarde, et recommencer. . *Un dossier de jeu* -- `games.dat`, des illustrations pour le menu, et lancer le jeu depuis celui-ci. *Troisième partie : la vidéo.* Lire du film comme monde du jeu, et les conventions d'arcade qui ont grandi autour. Sautez cette partie si votre jeu n'a pas besoin de vidéo ; rien de ce qui suit ne dépend d'elle. [start=14] . *Lire de la vidéo* -- le disque, les images, les sauts, et l'attente. . *L'autre façon de l'écrire* -- le modèle à fil d'exécution (« threaded »), et pourquoi il convient à la vidéo. . *Les embranchements* -- les choix, les chemins, et la forme d'un jeu vidéo à embranchements. . *Les pistolets optiques* -- viser, tirer, et le calibrage dont une borne a besoin. . *Les quick-time events* -- les invites, les fenêtres de temps, et noter la synchronisation du joueur. *Quatrième partie : tout le reste.* Chaque leçon tient debout seule ; prenez-les dans l'ordre que vous voulez. [start=19] . *Du texte qui a de l'allure* -- les polices, la qualité, et les mesures. . *Menus et écrans* -- la GUI, les documents, et la mise en forme. . *Les sous-titres* -- et pourquoi ils ont leur propre système. . *Passer à la 3D* -- les scènes, les caméras, et les coordonnées. . *Modèles et lumière* -- glTF, les matériaux, et l'animation. . *La physique* -- les corps, les forces, les articulations, et quand ne pas s'en servir. . *Les particules* -- les émetteurs, et faire une explosion. . *Des personnages qui se déplacent seuls* -- la navigation et la recherche de chemin. . *Musique et MIDI* -- les pistes, les SoundFonts, et les instruments. . *En ligne* -- les comptes, les tableaux des meilleurs scores, et le catalogue. . *Garder des données* -- les bases de données, les tables, et les questions que vous leur posez. . *Le publier* -- l'empaquetage, les correctifs, les licences, et la sortie. . *Dans une borne* -- les commandes, les menus de service, les bezels, et les choses qui ne comptent que sur du vrai matériel. include::lessons/01-hello.adoc[] include::lessons/02-numbers.adoc[] include::lessons/03-decisions.adoc[] include::lessons/04-repeating.adoc[] include::lessons/05-functions.adoc[] include::lessons/06-tables.adoc[] include::lessons/07-a-game.adoc[] include::lessons/08-when-it-goes-wrong.adoc[] include::lessons/09-pictures.adoc[] include::lessons/10-sound.adoc[] include::lessons/11-hitting-things.adoc[] include::lessons/12-score.adoc[] include::lessons/13-game-folder.adoc[] include::lessons/14-video.adoc[] include::lessons/15-threaded.adoc[] include::lessons/16-branching.adoc[] include::lessons/17-light-guns.adoc[] include::lessons/18-qte.adoc[] include::lessons/19-text.adoc[] include::lessons/20-gui.adoc[] include::lessons/21-subtitles.adoc[] include::lessons/22-3d.adoc[] include::lessons/23-models.adoc[] include::lessons/24-physics.adoc[] include::lessons/25-particles.adoc[] include::lessons/26-navigation.adoc[] include::lessons/27-midi.adoc[] include::lessons/28-online.adoc[] include::lessons/29-databases.adoc[] include::lessons/30-shipping.adoc[] include::lessons/31-cabinet.adoc[]