Solarus Wiki

A wiki for the Solarus engine community

Outils pour utilisateurs

Outils du site


fr:tutorial:money_system

Chap. 13Chap. 15Sommaire

Chapitre 14 : Les rubis

Dans ce chapitre, nous allons créer un système monétaire dans notre jeu via l'implémentation des Rubis. Nous allons donc devoir effacer notre sauvegarde car certaines données devront être bien initialisées lors de la création de la sauvegarde, et il y aura aussi une petite part de création du HUD (Head Up Display, ou Affichage Tête Haute) pour connaître le montant détenu par le héros.

Ressources

De nouvelles ressources sont nécessaires pour ce chapitre : il s'agit simplement de l'icône qui servira dans le HUD pour indiquer votre compteur de rubis. Comme d'habitude, vous pouvez aussi directement prendre l'archive complète.

Une nouvelle partie, des paramètres différents

Vous allez devoir effacer votre sauvegarde car nous allons légèrement modifier le script de création de sauvegarde. En effet, lorsque rien n'est fait, le montant de monnaie maximum pouvant être détenu par le héros est de 0. Nous allons devoir changer cela, à la création de la sauvegarde. N'oubliez pas les informations du premier chapitre : votre sauvegarde se trouve dans votre répertoire utilisateur, puis dans .solarus/<nomduprojet> (donc pour nous supprimez le fichier .solarus/tuto_solarus/save1.dat ).

Une fois ceci fait, changeons le montant par défaut accordé par le jeu lors de la création d'une partie.

Dans scripts/game_manager.lua à la ligne 19, changez le contenu du if :

  if not exists then
    game:set_starting_location("outside_b2", "start")
    game:set_max_money(100)
  end

Désormais, lorsque vous commencerez une nouvelle partie, le héros pourra obtenir jusqu'à 100 rubis dans un premier temps.

L'item Rubis

C'est bien beau d'avoir un maximum de 100 rubis, mais encore faut-il coder cette monnaie. Elle sera en 6 variantes : le rubis vert vaut 1 rubis, le bleu en vaut 5, le rouge en vaut 20, puis ensuite ce sont les rubis chiffrés : 50, 100 et 300. Allez donc dans l'éditeur de quête et ajoutez un nouvel item, ID : rupee et Nom : Rupee. Ouvrez ensuite le fichier avec votre éditeur de texte favori et mettez-y ce code :

local item = ...
local amounts = {1, 5, 20, 50, 100, 300} -- the amount for each variant
 
function item:on_created()
 
    -- Set properties of rupees
    item:set_shadow("small") -- the default shadow is the big one, not the case for rupees
    item:set_can_disappear(true) -- after some delay, the rupee will disappear
    item:set_brandish_when_picked(false) -- the hero does not brandish rupees when picked because it's a common item
    item:set_sound_when_picked("picked_rupee") -- the sound the rupee make when picked
end
 
function item:on_obtaining(variant, savegame_variable)
    local amount = amounts[variant] -- we get the amount of rupee for this variant
    item:get_game():add_money(amount) -- we add the game 
end

Analysons ce code, bien que les commentaires soient parfaitement explicites. Comme à l'accoutumée, la première ligne récupère l'objet passé en paramètre de l'appel du fichier (ici donc, le rubis). La seconde ligne servira de constante et vous permettra de connaître le nombre de rubis où que vous soyez dans le fichier (plus pratique que de chaque fois définir ce tableau, bien que dans le cas actuel on ne l'aurait déclaré qu'une seule fois).

La fonction item:on_created permet de définir les propriétés du rubis. Il a une petite ombre, il disparaît après quelques instants lorsqu'il gît sur le sol, il n'est pas brandi lorsqu'il est récupéré (c'est-à-dire qu'il n'y aura pas de dialogue lorsque le héros le récupère, ce serait intenable sinon) et enfin il a un son spécifique picked_rupee lorsqu'il est pris.

La fonction item:on_obtaining est la plus intéressante. Cette fonction prend deux paramètres, le premier est la variante de l'item et le second est la variable de sauvegarde. Ce second peut être nil si on ne veut pas sauvegarder l'item ainsi récupéré, ce sera le cas pour les drops des ennemis mais pas pour les coffres par exemple. La première ligne sert à savoir quel montant correspond à cette variante, grâce au tableau que l'on a mis en variable locale au fichier (amounts), et la seconde ligne permet de récupérer la partie et d'ajouter le montant ainsi défini à cette partie.

Version 1.1+

Il y a un bug sur item:on_obtained qui a été réglé dans la version 1.1+. En effet, dans le cas des trésors récupérés sur le sol, l'événement n'était pas déclenché. Prenez bien cela en compte lorsque vous codez vos objets en 1.0. item:on_obtaining étant appelé avant item:on_obtained, c'est de toute manière ce que nous voulions ici car lorsque nous ouvrirons un coffre contenant des rubis, ils devront être incrémentés pendant le dialogue et non pas après.

En lançant la partie ainsi après avoir placé un rubis sur la map, vous entendrez le doux son des espèces sonnantes et trébuchantes, mais comme nous n'avons pas fait le HUD nous ne saurons pas où en sont les comptes. De plus, il reste aussi un bug très bloquant : nous n'avons pas défini de dialogue pour ce trésor. Si vous essayez de mettre un coffre sur la map, vous aurez droit à un crash du jeu car il ne trouve pas le dialogue _treasure.rupee.variante. Réparons de suite ce bug.

Nouvel item, nouveau dialogue système

Vous devriez vous en douter car nous l'avons déjà fait plusieurs fois : ouvrez le fichier languages/fr/dialogs.dat à la ligne 165 et insérez le texte suivant :

-- 1 Rubis
dialog{
  id = "_treasure.rupee.1",
  icon = 90,
  text = [[
Tu as trouvé
1 Rubis !
]]
}
-------------------
 
-- 5 Rubis
dialog{
  id = "_treasure.rupee.2",
  icon = 91,
  text = [[
Tu as trouvé
5 Rubis !
]]
}
-------------------
 
-- 20 Rubis
dialog{
  id = "_treasure.rupee.3",
  icon = 92,
  text = [[
Tu as trouvé
20 Rubis !
]]
}
-------------------
 
-- 50 Rubis
dialog{
  id = "_treasure.rupee.4",
  icon = 93,
  text = [[
Tu as trouvé
50 Rubis !
Merveilleux !
]]
}
-------------------
 
-- 100 Rubis
dialog{
  id = "_treasure.rupee.5",
  icon = 94,
  text = [[
Tu as trouvé
100 Rubis !
Fantastique !
]]
}
-------------------
 
-- 300 Rubis
dialog{
  id = "_treasure.rupee.6",
  icon = 95,
  text = [[
Tu as trouvé
300 Rubis !
Incroyable !
]]
}
-------------------

Désormais, vous devriez pouvoir faire des coffres avec des rubis. N'oubliez pas que vos dialogues avec icônes ne doivent pas dépasser 20 caractères (pour cette implémentation des dialogues, évidemment… Une fois cette fonctionnalité personnalisée par vos soins, vous y mettrez bien sûr la limite que vous voudrez). Comme il s'agit de dialogues systèmes pour des trésors, le masque est _treasure.id_item.variante.

Maintenant que nous avons des rubis fonctionnels, attaquons-nous au HUD.

Un début de HUD

Nous allons faire un compteur de rubis. Pour cela, ouvrez le fichier script/game_manager.lua, à la fin de la fonction game_manager:create (juste avant le return), ajoutez le code suivant :

  local rupee_icon_img = sol.surface.create("hud/rupee_icon.png")
  local rupee_text = sol.text_surface.create()
  game.on_draw = function(game, dst_surface)
    rupee_text:set_text(game:get_money())
    rupee_icon_img:draw_region(0, 0, 12, 12, dst_surface, 10, 220)
    rupee_text:draw(dst_surface, 25, 228)
  end

Attelons-nous désormais à la traditionnelle analyse. La première ligne crée une surface tirée du sprite hud/rupee_icon.png. La seconde ligne crée une surface textuelle. Ensuite on redéfinit la façon dont est géré le on_draw de game : on récupère le montant de monnaie qu'a le héros via game:get_money(), et on modifie la valeur de la surface textuelle avec ce montant. On dessine seulement une région de la surface d'icône de rubis (c'est-à-dire qu'on ne va pas dessiner toute l'image, seulement une partie). On donne donc en premier paramètre le rectangle à dessiner, à savoir le rectangle commençant aux coordonnées 0,0 et d'une taille de 12×12, on la dessine sur la surface de destination récupérée en paramètre lors de l'événement game:on_draw et enfin on demande de dessiner cette région aux coordonnées 10, 220 de l'écran en général. Ici, les valeurs sont arbitraires, vous pourriez mettre le compteur de rubis au milieu en haut de l'écran par exemple. Enfin, on dessine la surface textuelle sur la surface de destination récupérée en paramètre aussi, aux coordonnées 25, 228 pour aligner à peu près le texte avec l'icône.

Cela fait beaucoup d'informations à digérer d'un coup, mais si vous lancez le jeu vous devriez avoir un compteur de rubis qui fonctionne. Son seul problème est qu'il ne s'incrémente pas “au fur et à mesure” : en effet, il apparaît de suite à la bonne valeur. Nous verrons pour faire une augmentation visible (et sonore) dans un prochain temps. Pas d'exercice pour cette fois, le cours du jour était assez indigeste comme ça ;)

Vous pouvez malgré tout télécharger la version finale du chapitre. Il y a dedans trois coffres dans l'arrière-boutique du magasin, dont un qui vous troll. Nous verrons plus tard ce que nous pourrions faire de ce coffre.

Chap. 13 : Les Bois PerdusChap. 14 : Ouvrir une boutiqueSommaire

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