Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - Jerelink

Pages: [1]
1
Development / Re: Diagonales avec le mouvement de type "straight"
« on: September 06, 2017, 02:09:04 pm »
Cela ne fonctionne pas tout à fait ^^, puis
Code: Lua
  1. movement:set_angle(math.pi*(2*direction.angle-1)%8/4)
me semble plus exact afin de fonctionner, autrement le script me renvoie un message d'erreur. Après, ce n'est pas bien grave, tant que ça fonctionne comme ça.
C'est assez rustique comme méthode mais ça fonctionne  ;D.

Merci quand même de ton aide PhoenixII54 !

2
Development / Re: Diagonales avec le mouvement de type "straight"
« on: August 26, 2017, 11:16:30 am »
J'ai plus ou moins trouvé les valeurs adéquates dans ce que cherche à faire avec math.pi/4 comme base.
Tout fonctionne correctement merci ! :) Cependant je me demande si ce n'est pas grossier d'avoir écrit cela comme suit :

Code: Lua
  1.     if direction.angle == 0 then
  2.       movement:set_angle(7 * math.pi / 4)  -- bas/droite
  3.     elseif direction.angle == 1 then
  4.       movement:set_angle(math.pi / 4)      --haut/droite
  5.     elseif direction.angle == 2 then
  6.       movement:set_angle(3 * math.pi / 4)  --haut/gauche
  7.     else
  8.       movement:set_angle(math.pi * 5 / 4)  --bas/gauche
  9.     end

3
Development / Diagonales avec le mouvement de type "straight"
« on: August 25, 2017, 09:28:51 pm »
Salut la communauté !

Je suis embêté par un petit problème concernant le mouvement de type "straight".
J'aimerais pouvoir déplacer une entité dans les quatre directions diagonales, seulement je ne comprends pas bien le concept de math.pi au delà des directions de base.

Autrement, est-il possible de faire cela différemment ? C'est dans le contexte d'un script de déplacement customisé pour certain type de pnj.

Merci et bonne soirée :)

4
Development / Re: Bonjour j'ai un petit problème
« on: April 12, 2017, 06:13:10 pm »
Bonjour, pour que les membres de ce forum puissent t'aider au mieux il nous faudrait plus de détails.
Peux-tu nous joindre ton script "main.lua" pour commencer ?

5
J'ai finalement trouvé une solution, je n'ai trouvé d'erreur nul part, du coup j'ai choisi d'utiliser une partie du script de Zelda ROTH:
Code: Lua
  1. local function draw_hearts(game, game_surface)
  2.  
  3.   local life = game:get_life()
  4.   local max_life = game:get_max_life()
  5.   for j = 1, max_life do
  6.     if j % 2 == 0 then
  7.       local x, y
  8.       if j <= 20 then
  9.         x = 40 + 4 * j
  10.         y = 0
  11.       else
  12.         x = 40 + 4 * (j - 20)
  13.         y = 8
  14.       end
  15.       if life >= j then
  16.         hearts_img:draw_region(0, 0, 8, 8, game_surface, x, y)
  17.       else
  18.         hearts_img:draw_region(16, 0, 8, 8, game_surface, x, y)
  19.       end
  20.     end
  21.   end
  22.   if life % 2 == 1 then
  23.     local x, y
  24.     if life <= 20 then
  25.       x = 40 + 4 * (life + 1)
  26.       y = 0
  27.     else
  28.       x = 40 + 4 * (life - 19)
  29.       y = 8
  30.     end
  31.     hearts_img:draw_region(8, 0, 8, 8, game_surface, x, y)
  32.   end
  33. end

Comme ça je n'ai plus a faire appel au script "hearts.lua"  8)

Merci a vous d'y avoir consacré du temps .

6
Alors dans le menu non, aucun affichage. J'ai suivi ton conseil et remplacé:
Code: Lua
  1. local game = game_manager:start_game(file_name)
par:
Code: Lua
  1. local game = sol.game.load(file_name)

Je n'ai plus d'erreur, mais toujours pas de cœur affiché.
J'ai chargé une partie, ça fonctionne. J'ai même lancé un print dans cette condition "else" afin de savoir si celle ci était traité et elle l'est.

7
Code: Lua
  1. local game_manager = {}
  2.  
  3. local initial_game = require("scripts/initial_game")
  4.  
  5. -- Starts the game from the given savegame file,
  6. -- initializing it if necessary.
  7. function game_manager:start_game(file_name)
  8.  
  9.   local exists = sol.game.exists(file_name)
  10.   local game = sol.game.load(file_name)
  11.   if not exists then
  12.     -- Initialize a new savegame.
  13.     initial_game:initialize_new_savegame(game)
  14.   end
  15.   game:start()

Justement oui, en jeu les cœurs sont présent et fonctionnent parfaitement.

8
J'ai tenté le print, il affiche "nil".
Si je lance je jeu sans sauvegarde enregistré, tout ce passe bien et je peut commencer une partie. En revanche, avec une sauvegarde, il me renvoi l'erreur mentionné précédemment.
Je précise quand même que le print ne fonctionne que dans "on_started", si je le met a la suite de:
Code: Lua
  1.   local hearts = hearts_builder:new(game, { x = 0, y = 0 })

Alors rien ne se passe.
J'ai pas pour habitude de venir demander de l'aide au premier problème, mais là je sèche totalement '-'.

9
J'ai changé la valeur par "file_name" voir si ça changé quelque chose. Mais il semblerai que le paramètre game pose souci dans le script "hearts" d'après le message d'erreur. Désolé mais je doit vraiment être bête  ;D

10
Fait, maintenant c'est au tour de "game" de poser problème.

Code: Lua
  1. Error: In on_started: [string "scripts/hud/hearts.lua"]:14: attempt to index local 'game' (a nil value)

11
Le seul truc que je vois c'est le config.x, config.y, une table, qui, si n'est pas définie, retournera nil, quelqu'en soit la raison, et donc le script retournera une erreur

Ce que je n'arrive pas a comprendre, c'est que ce script fonctionne très bien dans la partie, les cœurs s'affichent. J'ai était voir du coté du script (script/hud/hud) étant donné que celui-ci gère intégralement le HUD, mais là aussi aucune table.

@Jerelink: post both the error and all the code of the script that appears in the error. But display the script code as in Lua, so that we can see the lines of the script and find the good one. (To do that, write "code=Lua" in the first bracket, instead of just "code". Always do that when you post Lua code here; that will make our lifes easier.)

Merci du conseil ;). La seule erreur affiché lors de l’exécution est celle-ci :
Code: Lua
  1. Error: In on_started: [string "scripts/hud/hearts.lua"]:12: attempt to index local 'config' (a nil value)

Puis celle-ci qui est selon moi la conséquence de la première erreur ^^ :
Code: Lua
  1. Error: In on_draw: [string "scripts/menus/savegames.lua"]:79: attempt to index a nil value

Chose anormale du fait que le script "hearts" n'a aucune erreur sauf lorsque je l'appel dans le script "savegames" :/.

Je reposte ça ici au cas ou:
Code: Lua
  1. local savegames_menu = {}
  2.  
  3. local game_manager = require("scripts/game_manager")
  4. local gui_designer = require("scripts/menus/lib/gui_designer")
  5. local hearts_builder = require("scripts/hud/hearts")
  6. local cursor_img = sol.surface.create("menus/link_cursor.png")
  7. local cursor_position
  8. local savegames_surfaces = {}
  9. local games = {}
  10.  
  11. local layout
  12.  
  13. local function build_layout()
  14.  
  15.   layout = gui_designer:create(320, 240)
  16.   layout:make_green_tiled_background()
  17.   layout:make_big_wooden_frame(16, 8, 160, 32)
  18.   layout:make_text(sol.language.get_string("savegames_menu.title"), 96, 16, "center")
  19.   layout:make_wooden_frame(16, 48, 288, 32)
  20.   layout:make_wooden_frame(16, 96, 288, 32)
  21.   layout:make_wooden_frame(16, 144, 288, 32)
  22. end
  23.  
  24. -- Places the cursor on the savegame 1, 2 or 3.
  25. local function set_cursor_position(index)
  26.  
  27.   cursor_position = index
  28.   cursor_img:set_xy(26, 2 + index * 48)
  29. end
  30.  
  31. local function get_savegame_file_name(index)
  32.   return "save" .. index .. ".dat"
  33. end
  34.  
  35. -- Draws the hearts of a game on a savegame surface.
  36. local function draw_hearts(game, surface)
  37.  
  38.  
  39.   local hearts = hearts_builder:new(game)
  40.  
  41.   hearts:on_started()
  42.   hearts:on_draw(surface)
  43. end
  44.  
  45. -- Reads the existing savegames and creates the savegames surfaces.
  46. local function read_savegames()
  47.  
  48.   for i = 1, 3 do
  49.     local file_name = get_savegame_file_name(i)
  50.     local surface = sol.surface.create(240, 16)
  51.     surface:set_xy(56, 8 + i * 48)
  52.     savegames_surfaces[i] = surface
  53.    
  54.     if not sol.game.exists(file_name) then
  55.       games[i] = nil
  56.     else
  57.       -- Existing file.
  58.       local game = game_manager:start_game(file_name)
  59.       games[i] = game
  60.      
  61.       draw_hearts(game, surface)
  62.     end
  63.   end
  64. end
  65.  
  66. function savegames_menu:on_started()
  67.  
  68.   build_layout()
  69.   read_savegames()
  70.   sol.audio.play_music("game_over")
  71.   set_cursor_position(1)
  72. end
  73.  
  74. function savegames_menu:on_draw(dst_surface)
  75.  
  76.   layout:draw(dst_surface)
  77.  
  78.   for i = 1, 3 do
  79.     savegames_surfaces[i]:draw(dst_surface)
  80.   end
  81.   cursor_img:draw(dst_surface)
  82. end
  83.  
  84. function savegames_menu:on_key_pressed(key)
  85.  
  86.   local handled = false
  87.  
  88.   if key == "space" then
  89.     local file_name = get_savegame_file_name(cursor_position)
  90.     game_manager:start_game(file_name)
  91.     sol.menu.stop(savegames_menu)
  92.     handled = true
  93.  
  94.   elseif key == "down" then
  95.     if cursor_position < 3 then
  96.       set_cursor_position(cursor_position + 1)
  97.     else
  98.       set_cursor_position(1)
  99.     end
  100.     sol.audio.play_sound("cursor")
  101.     handled = true
  102.  
  103.   elseif key == "up" then
  104.     if cursor_position > 1 then
  105.       set_cursor_position(cursor_position - 1)
  106.     else
  107.       set_cursor_position(3)
  108.     end  
  109.     sol.audio.play_sound("cursor")
  110.     handled = true
  111.  
  112.   end
  113.  
  114.   return handled
  115. end
  116.  
  117. return savegames_menu

Ce paramètre config a été ajouté relativement récemment à mes scripts de HUD pour faciliter l'ajout/suppression/déplacement d'éléments.
Tu dois pouvoir juste passer ce paramètre depuis le script du menu de sauvegardes. Il faut passer un tableau avec les champs x et y correspondant à la position où tu veux afficher les cœurs. Cette position était auparavant indiquée en appelant la fonction set_dst_position().

(Mais ton script heart_builder vient d'où ? Parce que normalement, je croyais avoir justement fait en sorte que le config soit optionnel pour que ça continue à marcher avec l'ancienne façon)

Ce script provient directement de tes tutos les plus récents et n'a pas été modifié.
Je n'ai pas tenté l'ajout d'un tableau dans ce script car honnêtement, je ne sais pas comment configurer ça du a mon manque d’expérience :/.


12
Personne pour m'aider ?

13
Je n'utilise aucun élément du moteur custom de Zelda ROTH a ma connaissance, d’ailleurs j'ai était voir les scripts du moteur en question afin de m'inspirer, mais je préfère rester sur ceux-ci.

Heart_builder est appelé dans le scripts savegames, dans cette fonction :

Code: [Select]
local function draw_hearts(game, surface)

  local hearts = hearts_builder:new(game)
  hearts:on_started()
  hearts:on_draw(surface)
end

Ici il manque le paramètre "Config", mais même avec celui-ci ça ne fonctionne pas. Quant à config.x/config.y je me suis posé la même question sans trop y accorder d'importance étant donné que le scripts "Hearts" fonctionne parfaitement IG.

14
Salut Christopho,

Effectivement, il s'agit là d'un problème de compatibilité entre scripts et non entre les versions. J'ai eu ce doute a cause du ":create: sans faire le lien avec les fonctions programmé dans le game_manager.
C'est bien le scripts du tuto oui, je l'ai juste adapté pour fonctionner avec le plus récent game_manager.
Voici le game_manager, il est vraiment vide, c'est une nouvelle quête :) :
Code: [Select]
local game_manager = {}

local initial_game = require("scripts/initial_game")

-- Starts the game from the given savegame file,
-- initializing it if necessary.
function game_manager:start_game(file_name)

  local exists = sol.game.exists(file_name)
  local game = sol.game.load(file_name)
  if not exists then
    -- Initialize a new savegame.
    initial_game:initialize_new_savegame(game)
  end
  game:start()

end

return game_manager

Puis l'afficheur des cœurs, le scripts qui doit poser souci au menus des sauvegarde ^^:

Code: [Select]
-- Hearts view used in game screen and in the savegames selection screen.

local hearts_builder = {}

local hearts_img = sol.surface.create("hud/hearts.png")

function hearts_builder:new(game, config)

  local hearts = {}

  hearts.surface = sol.surface.create(80, 16)
  hearts.dst_x = config.x
  hearts.dst_y = config.y
  hearts.max_life_displayed = game:get_max_life()
  hearts.current_life_displayed = game:get_life()

  function hearts:repeat_danger_sound()

    if game:get_life() <= game:get_max_life() / 4 then

      sol.audio.play_sound("danger")
      hearts.danger_sound_timer = sol.timer.start(hearts, 750, function()
        hearts:repeat_danger_sound()
      end)
      hearts.danger_sound_timer:set_suspended_with_map(true)
    else
      hearts.danger_sound_timer = nil
    end
  end

  function hearts:rebuild_surface()

    hearts.surface:clear()

    local life = hearts.current_life_displayed
    local max_life = hearts.max_life_displayed
    for j = 1, max_life do
      if j % 2 == 0 then
        local x, y
        if j <= 20 then
          x = 4 * (j - 2)
          y = 0
        else
          x = 4 * (j - 22)
          y = 8
        end
        if life >= j then
          hearts_img:draw_region(0, 0, 8, 8, hearts.surface, x, y)
        else
          hearts_img:draw_region(16, 0, 8, 8, hearts.surface, x, y)
        end
      end
    end
    if life % 2 == 1 then
      local x, y
      if life <= 20 then
        x = 4 * (life - 1)
        y = 0
      else
        x = 4 * (life - 21)
        y = 8
      end
      hearts_img:draw_region(8, 0, 8, 8, hearts.surface, x, y)
    end
  end

  function hearts:on_draw(dst_surface)

    local x, y = hearts.dst_x, hearts.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

    hearts.surface:draw(dst_surface, x, y + 18)
  end

  -- Checks whether the view displays correct information
  -- and updates it if necessary.
  local function check()

    local need_rebuild = false

    -- Maximum life.
    local max_life = game:get_max_life()
    if max_life ~= hearts.max_life_displayed then
      need_rebuild = true
      hearts.max_life_displayed = max_life
    end

    -- Current life.
    local current_life = game:get_life()
    if current_life == hearts.current_life_displayed then
      hearts.sound_remainder = nil
    else

      need_rebuild = true
      if current_life < hearts.current_life_displayed then
        hearts.current_life_displayed = hearts.current_life_displayed - 1
      else
        hearts.current_life_displayed = hearts.current_life_displayed + 1
        if game:is_started() then
          if hearts.sound_remainder == nil then
            hearts.sound_remainder = hearts.current_life_displayed % 4
          end
          if hearts.current_life_displayed % 4 == hearts.sound_remainder then
            sol.audio.play_sound("heart")
          end
        end
      end
    end

    -- If we are in-game, play an animation and a sound if the life is low.
    if game:is_started() then

      if game:get_life() <= game:get_max_life() / 4
          and not game:is_suspended() then
        need_rebuild = true
        if hearts.danger_sound_timer == nil then
          hearts.danger_sound_timer = sol.timer.start(hearts, 250, function()
            hearts:repeat_danger_sound()
          end)
          hearts.danger_sound_timer:set_suspended_with_map(true)
        end
      end
    end

    -- Redraw the surface only if something has changed.
    if need_rebuild then
      hearts:rebuild_surface()
    end

    return true  -- Repeat the timer.
  end

  function hearts:on_started()

    -- This function is called when the HUD starts or
    -- was disabled and gets enabled again.
    -- Unlike other HUD elements, the timers were canceled because they
    -- are attached to the menu and not to the game
    -- (this is because the hearts may also be used in the savegame menu).
    hearts.danger_sound_timer = nil
    -- Periodically check.
    check()
    sol.timer.start(hearts, 50, check)
    hearts:rebuild_surface()
  end

  return hearts
end

return hearts_builder


15
Bonjour a tous !

  Je me présente, Jerelink, membre de ZS depuis un long moment déjà, je m’intéresse depuis peu au moteur Solarus et souhaite par conséquent obtenir de l'aide sur ce forum  :).

  Tout d’abord, je tiens à m'excuser de ne pas poster ce message en anglais, mes connaissances sont faibles, de ce fait je trouve qu'il est plus judicieux de procéder ainsi plutôt qu'utiliser Google traduction (sauf si vous préférez ce dernier évidement) .

Voici mon problème:
  Débutant que je suis, j’essaie de créer un menu des sauvegardes en me basant sur les tutos de Christopho ( E46 et E47), seulement, il y a quelques petits problèmes de compatibilités entre les versions 1.1 et l'actuelle. Pour commencer,
Code: [Select]
game_manager:create(file_name) ne fonctionne pas sous 1.5. Je l'ai donc remplacé par
Code: [Select]
start_game même si je doute que ça soit son équivalent, mais n'ayant rien trouvé d'autre dans l'api...

  Ensuite, le hearts_builder pour afficher les cœurs sur la/les parties existantes. Ma version du HUD est la même que dans le tuto HUD en 1.5 (EP 33) et dans le script "hearts.lua", la function "hearts_builder" fait appelle a un deuxième paramètre hearts_builder:new(game, config) et c'est là que vient le plus gros du problème.  A l’exécution, tout ce passe correctement, mais dès l'ajout de cette ligne
Code: [Select]
draw_hearts(game, surface) dans la fonction "read_savegames()", j'ai ce message d'erreur qui s'affiche:
Quote
Error: In on_started: [string "scripts/hud/hearts.lua"]:12: attempt to index local 'config' (a nil value)

J'ai essayé pas mal de choses pour contourner ce bug mais rien y fait.

Voici mon code :

Code: [Select]
local savegames_menu = {}

local game_manager = require("scripts/game_manager")
local gui_designer = require("scripts/lib/gui_designer")
local hearts_builder = require("scripts/hud/hearts")

local cursor_img = sol.surface.create("menus/link_cursor.png")
local cursor_position
local savegames_surfaces = {}
local games = {}

local layout

local function build_layout()

  layout = gui_designer:create(320, 240)
  layout:make_background()
  layout:make_big_wooden_frame(16, 8, 160, 32)
  layout:make_text(sol.language.get_string("savegames_menu.title"), 96, 16, "center")
  layout:make_wooden_frame(16, 48, 288, 32)
  layout:make_wooden_frame(16, 96, 288, 32)
  layout:make_wooden_frame(16, 144, 288, 32)
end

-- Places the cursor on the savegame 1, 2 or 3.
local function set_cursor_position(index)

  cursor_position = index
  cursor_img:set_xy(26, 2 + index * 48)
end

local function get_savegame_file_name(index)
  return "save" .. index .. ".dat"
end

-- Draws the hearts of a game on a savegame surface.
local function draw_hearts(game, surface)

  local hearts = hearts_builder:new(game)
  hearts:on_started()
  hearts:on_draw(surface)
end

-- Reads the existing savegames and creates the savegames surfaces.
local function read_savegames()

  for i = 1, 3 do
    local file_name = get_savegame_file_name(i)
    local surface = sol.surface.create(240, 16)
    surface:set_xy(56, 8 + i * 48)
    savegames_surfaces[i] = surface
   
    if not sol.game.exists(file_name) then
      games[i] = nil
    else
      -- Existing file.
      local game = game_manager:start_game(file_name)
      games[i] = game
     
      --draw_hearts(game, surface)
    end
  end
end

function savegames_menu:on_started()

  build_layout()
  read_savegames()
  sol.audio.play_music("game_over")
  set_cursor_position(1)
end

function savegames_menu:on_draw(dst_surface)

  layout:draw(dst_surface)
 
  for i = 1, 3 do
    savegames_surfaces[i]:draw(dst_surface)
  end
  cursor_img:draw(dst_surface)
end

function savegames_menu:on_key_pressed(key)

  local handled = false

  if key == "space" then
    local file_name = get_savegame_file_name(cursor_position)
    game_manager:start_game(file_name)
    sol.menu.stop(savegames_menu)
    handled = true

  elseif key == "down" then
    if cursor_position < 3 then
      set_cursor_position(cursor_position + 1)
    else
      set_cursor_position(1)
    end
    sol.audio.play_sound("cursor")
    handled = true

  elseif key == "up" then
    if cursor_position > 1 then
      set_cursor_position(cursor_position - 1)
    else
      set_cursor_position(3)
    end 
    sol.audio.play_sound("cursor")
    handled = true

  end

  return handled
end

return savegames_menu

Je pense avoir tout dit, je vous remercie de m'avoir lu, bonne journée a tous  ;).

Pages: [1]