Solarus Wiki

A wiki for the Solarus engine community

Outils pour utilisateurs

Outils du site


fr:tutorial:switch_enabling_chest

Chap. 11Chap. 13Sommaire

Chapitre 12 : Bouton débloquant un coffre

Dans ce chapitre, nous allons apprendre à utiliser les boutons afin d'exécuter des scripts pouvant être divers et variés.

Ressources

De nouvelles ressources sont nécessaires pour ce chapitre : il s'agit des sons utilisés pour mettre de l'ambiance (donc non pas les musiques). Comme à l'accoutumée : désarchivez les fichiers dans le dossier correspondant (sounds) et au choix, remplacez le fichier project_db.dat par celui de l'archive ou copiez les lignes commençant par le chiffre 4 et remplacez les lignes que vous aviez déjà qui commence par ce même chiffre ; vous pouvez aussi ajouter à la mano depuis l'éditeur tous vos nouveaux sons… Au choix.

Comme d'habitude, vous pouvez aussi télécharger directement l'archive data ayant déjà reçu toutes ces modifications et qui contient aussi les résultats des précédents chapitre.

Préparer le terrain

Mettre un interrupteur

Ouvrez la map Village Cave 1F et placez un interrupteur sur la plate-forme de gauche, caché par un vase au milieu d'autres destructibles. Pour faire un interrupteur, c'est l'icône à côté des murs invisibles. Si vous regardez les options d'un interrupteur, vous verrez qu'elles sont très explicites. Une rapide explication sur les subtypes :

  • Walkable invisible : il faut marcher dessus (ou poser un bloc dessus), mais il est invisible.
  • Walkable visible : c'est l'interrupteur par défaut, le plus basique. Il est visible, il faut marcher dessus ou traîner un bloc dessus pour l'activer
  • Arrow target : il est invisible et pour l'activer il faut envoyer une flèche dessus. C'est ce type là qui se trouve dans les yeux des statues.
  • Solid : le sprite par défaut reprend les interrupteurs de cristal. Vous pouvez l'activer grâce à une arme mais vous ne pouvez pas marcher dessus.

Donnez un nom à votre interrupteur car il sera utilisé dans le script de la map, et il va en être de même pour le coffre. Le coffre se nommera flippers_chest, et l'interrupteur sera enable_chest_switch. Plus les noms sont précis, plus vous vous retrouverez dans vos fichiers de scripts.

Disparition du coffre par défaut

L'intérêt de l'interrupteur va être de faire apparaître le coffre contenant les Palmes. Mais pour qu'il y ait apparition, il faut d'abord indiquer que le coffre n'est pas disponible. Pour cela, ouvrez le script de la map dans votre éditeur de texte préféré (le fichier lua, pas le fichier dat). Il est vide, ce qui est normal : la map n'a pour l'instant aucun comportement spécifique, uniquement des tiles et des entités.

Les fichiers lua des maps sont du même genre que les fichiers d'items : ils sont appelés automatiquement par le moteur, en l'occurence il est appelé lorsque la map est chargé. Comme pour l'item, le fichier est appelé avec la map en paramètre, donc on va la récupérer de la même manière. Ajoutez le code suivant :

local map = ...
 
function map:on_started()
  -- Disable the chest
  flippers_chest:set_enabled(false)
end
 
enable_chest_switch.on_activated = function()
 
  -- Enable the chest
  flippers_chest:set_enabled(true)
  sol.audio.play_sound("chest_appears")
end

Expliquons déjà ces quelques lignes de code, bien que si on ne laisse que ça nous aurons un bug et l'énigme ne pourra pas être résolue. La ligne function map:on_started() sera lancée par le moteur lorsque la map commencera. Lors de cette fonction, nous désactivons le coffre grâce à set_enabled. Ne confondez pas cette fonction avec set_visible. Là où set_enabled désactivera complètement le coffre, set_visible ne fera que le cacher mais il pourra toujours être ouvert par le joueur si ce dernier sait où il se trouve.

Une petite explication sur les diverses méthodes de notation de Lua. function map:on_started() est strictement équivalent à map:on_started = function(). La première notation est une sorte de raccourci, mais en Lua les fonctions sont des données comme des autres, donc elles sont stockées dans des variables. Ici, on indique que la propriété “on_started” de l'objet “map” est une fonction. Une autre chose que vous devrez apprendre, c'est choisir entre le : et le . pour appeler une fonction.

function map:on_started() est du coup strictement équivalent à function map.on_started(map). La notation avec : permet de répéter automatiquement l'objet appelant comme premier paramètre de la fonction. On pourrait presque parler d'ersatz de fonction statique et dynamique : la notation avec le : indique forcément une fonction dynamique (car l'objet appelant est passé en paramètre), alors que la notation avec le . ressemblerait plutôt à une fonction statique : on n'a pas besoin de l'objet appelant dans la fonction.

C'est pour cela que pour jouer un son, il faut faire sol.audio.play_sound et surtout pas sol.audio:play_sound : la seconde renverrait une erreur car le seul paramètre attendu pour cette fonction c'est le nom du fichier, or là nous en enverrions deux : l'objet appelant (sol.audio) et le nom du fichier.

Maintenant que vous avez les clés pour vous dépatouiller avec les diverses notations, lancez le jeu. Appuyez sur l'interrupteur, le coffre est censé apparaître. Remontez à l'étage et tombez dans le trou vous menant au coffre. Il a de nouveau disparu. En effet, vous êtes sorti de la map, et lorsque vous y êtes entré à nouveau, la map s'est réinitialisée. C'est ce qui fait que les vases, les ennemis reviennent. Pour bien faire, il faut sauvegarder quelque part que l'interrupteur a été activé. Voici le code complet de la map :

local map = ...
 
function map:on_started()
 
  -- The switch has never been activated
  if not map:get_game():get_value("flippers_chest_enabled") then
    -- Disable the chest
    flippers_chest:set_enabled(false)
  else
    -- Set the switch already activated
    enable_chest_switch:set_activated(true)
  end
end
 
enable_chest_switch.on_activated = function()
 
  -- Enable the chest
  flippers_chest:set_enabled(true)
  sol.audio.play_sound("chest_appears")
 
  -- Save the fact chest has been enabled
  map:get_game():set_value("flippers_chest_enabled", true)
end

La ligne map:get_game():set_value() récupère la partie depuis la map, puis enregistre la variable flippers_chest_enabled à true. Du coup, lorsque la map est chargée, on vérifie si cette variable n'existe pas ou est à false, auquel cas on cache le coffre, sinon on active l'interrupteur (car cette variable n'est activée que par l'interrupteur).

Désormais, votre énigme est complète. Pas d'exercice sur cet épisode, le temps de vous laisser digérer tout ce chapitre et ses nombreux concepts parfois un peu obscurs (en particulier sur les diverses notations Lua).

Chap. 11 : Plate-formes en demi-niveauChap. 13 : Bois PerdusSommaire

fr/tutorial/switch_enabling_chest.txt · Dernière modification: 2018/12/22 14:14 (modification externe)