Solarus Wiki

A wiki for the Solarus engine community

Outils pour utilisateurs

Outils du site


fr:tutorial:switch_enabling_chest

Différences

Cette page vous affiche les différences entre la révision choisie et la version actuelle de la page.

Lien vers cette vue comparative

fr:tutorial:switch_enabling_chest [2018/12/22 14:14] (Version actuelle)
Ligne 1: Ligne 1:
 +[[{:​wiki:​arrow_left.png|width:​137px;​float:​left;​}fr:​tutorial:​inter_layers_platforms|Chap. 11]][[{:​wiki:​arrow_right.png|width:​137px;​float:​right;​}fr:​tutorial:​lost_woods|Chap. 13]][[{:​wiki:​home.png|width:​132px;​}fr:​tutorial:​create_your_2d_game_with_solarus|Sommaire]]
  
 +====== 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 {{:​fr:​tutorial:​ressources012.zip|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 {{:​fr:​tutorial:​data012.zip|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 :
 +
 +<code lua>
 +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
 +</​code>​
 +
 +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 à [[http://​www.solarus-games.org/​doc/​latest/​lua_api_entity.html#​lua_api_entity_set_enabled|set_enabled]]. Ne confondez pas cette fonction avec [[http://​www.solarus-games.org/​doc/​latest/​lua_api_entity.html#​lua_api_entity_set_visible|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 :
 +
 +<code lua>
 +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
 +</​code>​
 +
 +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).
 +
 +[[{:​wiki:​arrow_left.png|width:​210px;​float:​left;​}fr:​tutorial:​inter_layers_platforms|Chap. 11 : Plate-formes en demi-niveau]][[{:​wiki:​arrow_right.png|width:​210px;​float:​right;​}fr:​tutorial:​lost_woods|Chap. 13 : Bois Perdus]][[{:​wiki:​home.png|width:​203px;​}fr:​tutorial:​create_your_2d_game_with_solarus|Sommaire]]
fr/tutorial/switch_enabling_chest.txt · Dernière modification: 2018/12/22 14:14 (modification externe)