Small Key HUD ?

Started by dpro_games, April 04, 2017, 09:05:39 PM

Previous topic - Next topic
En fait, je commence vraiment la programmation et là, çà fait déjà plusieurs semaine que je bloque sur le système de clé avec le HUD... Donc en gros je ne comprend rien au script "equipment" (je doit supprimer quoi pour faire le truc le plus simple possible) et où je doit placer le require de ce script ? Vraiment merci d'accorder du temps au nouveau développeur !

April 05, 2017, 02:52:36 PM #16 Last Edit: April 05, 2017, 02:54:17 PM by Christopho
Donc si je comprends bien tu veux faire un item dont le seul effet est d'augmenter un compteur sauvegardé.
C'est en effet beaucoup plus simple si tu n'as pas de compteurs différents dans chaque donjon. Dans ce cas oublie mon script equipment.lua.

C'est comme l'item rubis, sauf qu'au lieu de game:add_money() tu incrémentes un compteur à toi.

Code (lua) Select

local item = ...

function item:on_obtaining(variant, savegame_variable)

  local count = game:get_value("num_small_keys") or 0
  game:set_value("num_small_keys", count + 1)
end

Est-ce que le code cet item est clair ?

Et ton HUD n'a plus qu'à afficher la valeur de game:get_value("num_small_keys").

Il y a encore un problème quand je prend une clé, j'ai une erreur différente maintenant :

Error: In on_obtaining: [string "items/small_key.lua"]:12: attempt to index global 'game' (a nil value)

Ah oui, j'ai oublié de mettre une ligne local game = item:get_game().
Mais ça il faudrait savoir le corriger à l'aide du message d'erreur.

Ca marche !! Merci beaucoup !!  :)

J'ai de nouveau un problème au niveau du HUD cette fois, mais il me semble que j'ai presque réussis...

Le code du HUD pour la small_key :

-- The small_key counter shown in the game screen.

local small_key_builder = {}

local small_key_icon_img = sol.surface.create("hud/small_key_icon.png")

function small_key_builder:new(game, config)

  local small_key = {}

  local digits_text = sol.text_surface.create({
    font = "white_digits",
    horizontal_alignment = "left",
    vertical_alignment = "top",
  })
  local small_key_displayed = game:get_value("small_keys_save")

  local dst_x, dst_y = config.x, config.y

  function small_key:on_draw(dst_surface)

    local x, y = dst_x, dst_y
    local width, height = dst_surface:get_size()
    if x < 0 then
      x = width + x
    end
    if y < 0 then
      y = height + y
    end

    small_key_icon_img:draw(dst_surface, x + 8, y)
    digits_text:draw(dst_surface, x, y + 10)
  end

end

return small_key_builder


Mais j'ai une erreur :

Error: In on_started: [string "scripts/hud/hud.lua"]:21: attempt to index local 'element' (a nil value)

Voici le script de la clé :

local item = ...
local game = item:get_game()

function item:on_created()

  self:set_shadow("small")
  self:set_brandish_when_picked(false)
  self:set_sound_when_picked("picked_small_key")
end

function item:on_obtaining(variant, savegame_variable)

  local count = game:get_value("small_keys_save") or 0
  game:set_value("small_keys_save", count + 1)
end

Tu nous montres deux fichiers mais pas celui pointé dans le message d'erreur...

Ah oui pardon, je suis débile...  ;D

-- Script that creates a head-up display for a game.

-- Usage:
-- require("scripts/hud/hud")

require("scripts/multi_events")
local hud_config = require("scripts/hud/hud_config")

-- Creates and runs a HUD for the specified game.
local function initialize_hud_features(game)

  -- Set up the HUD.
  local hud = {
    enabled = false,
    elements = {},
  }

  for _, element_config in ipairs(hud_config) do
    local element_builder = require(element_config.menu_script)
    local element = element_builder:new(game, element_config)
    if element.set_dst_position ~= nil then
      -- Compatibility with old HUD element scripts
      -- whose new() method don't take a config parameter.
      element:set_dst_position(element_config.x, element_config.y)
    end
    hud.elements[#hud.elements + 1] = element
  end

  -- Destroys the HUD.
  function hud:quit()

    if hud:is_enabled() then
      -- Stop all HUD elements.
      hud:set_enabled(false)
    end
  end

  -- Returns whether the HUD is currently enabled.
  function hud:is_enabled()
    return hud.enabled
  end

  -- Enables or disables the HUD.
  function hud:set_enabled(enabled)

    if enabled ~= hud.enabled then
      hud.enabled = enabled

      for _, menu in ipairs(hud.elements) do
        if enabled then
          -- Start each HUD element.
          sol.menu.start(game, menu)
        else
          -- Stop each HUD element.
          sol.menu.stop(menu)
        end
      end
    end
  end

  -- Returns whether the HUD is currently shown.
  function game:is_hud_enabled()
    return hud:is_enabled()
  end

  -- Enables or disables the HUD.
  function game:set_hud_enabled(enable)
    return hud:set_enabled(enable)
  end

  -- Call this function to notify the HUD that the current map has changed.
  local function hud_on_map_changed(game, map)

    if hud:is_enabled() then
      for _, menu in ipairs(hud.elements) do
        if menu.on_map_changed ~= nil then
          menu:on_map_changed(map)
        end
      end
    end
  end

  -- Call this function to notify the HUD that the game was just paused.
  local function hud_on_paused(game)

    if hud:is_enabled() then
      for _, menu in ipairs(hud.elements) do
        if menu.on_paused ~= nil then
          menu:on_paused()
        end
      end
    end
  end

  -- Call this function to notify the HUD that the game was just unpaused.
  local function hud_on_unpaused(game)

    if hud:is_enabled() then
      for _, menu in ipairs(hud.elements) do
        if menu.on_unpaused ~= nil then
          menu:on_unpaused()
        end
      end
    end
  end

  game:register_event("on_map_changed", hud_on_map_changed)
  game:register_event("on_paused", hud_on_paused)
  game:register_event("on_unpaused", hud_on_unpaused)

  -- Start the HUD.
  hud:set_enabled(true)
end

-- Set up the HUD features on any game that starts.
local game_meta = sol.main.get_metatable("game")
game_meta:register_event("on_started", initialize_hud_features)
return true

Dans la fonction small_key_builder:new() tu as oublié de retourner le menu que tu viens de créer. Donc element est nil.

Juste, comment faire pour que ma variable qui compte les clés soit égale a zéro aux début du jeu et pas a "nil" ?

Une astuce est de faire comme mon code plus beau :
Code (lua) Select

local count = game:get_value("small_keys_save") or 0

Rajouter "or 0" au bout pour initialiser à 0 si c'est nil.

Autre solution, initialiser au début du jeu (dans initial_game.lua) mais je me vois mal initialiser toutes les futures variables du jeu dès le départ.

Ça marche enfin !!  ;D
Vraiment merci de m'avoir accordé du temps pour m'aider ! J'ai compris plein de chose sur le fonctionnement de Solarus !

Et un gros GG pour avoir conçu le moteur de mes rêve: Solarus !   :)

Content que tu aies compris et pas juste reproduit du coup ^^
Tu vas pouvoir continuer à progresser :)