[BUG] pb sur un item personnalisé

Démarré par oldm4n, 07 Août 2015 à 21:30

0 Membres et 1 Invité sur ce sujet

07 Août 2015 à 21:30 Dernière édition: 07 Août 2015 à 21:54 par oldm4n
Bonjour,

Je découvre ce site et le moteur Solarus.

Après avoir regardé les vidéos, je me suis lancé dans la réalisation d'un item: une fronde.

Pour ça, j'utilise une custom entity pour les billes, et, dans mon code, quand elle rencontre une entity qui n'est pas un enemy, je joue un son (je n'utilise pas un movement pour le déplacement de la bille mais un set_position).

je ne fais pas ça sur une quête que j'ai créé mais sur la quête zsdx, comme ça j'ai tout en environnement pour mes tests.

Bref, quand ma bille rencontre une entity non enemy, solarus crashe et avant ça j'ai comme erreur:
"La quête s'est terminée avec une erreur: Failed to fill the audio buffer with decoded IT data for music file 'music/overworld.it: error 40961"

Je sèche ... des idées ?

voici mon code:
[spoiler]
local item = ...

function item:on_created()
  self:set_savegame_variable("possession_slingshot")
  self:set_amount_savegame_variable("number_slingshot")
  self:set_assignable(true)
end

function item:on_using()
  local game = item:get_game()
  local hero = item:get_map():get_hero()
 
  print "01"

  if self:get_amount()==0 then
    sol.audio.play_sound("wrong")
    print "02"
  else
    print "03"
    --Remove the bullet from the equipment after a small delay
    sol.timer.start(300, function()
      self:remove_amount(1)
    end)
   print "04"
   --Detect enemies
   local x, y, layer = hero:get_position()
   local direction4 = hero:get_direction()
   
   if direction4 == 0 then x = x + 16
   elseif direction4 == 1 then y = y -16
   elseif direction4 == 2 then x = x - 16
   else y = y + 16
   end
   
   local bullet = game:get_map():create_custom_entity{
      x = x,
      y = y,
      layer = layer,
      width = 8,
      height = 8,
      direction = 0,
   }
   bullet:set_origin(4, 5)
   bullet:create_sprite("entities/bullet")
   local distance = 0
   --Start the animation
    -- hero:set_animation("slingshot", function()
      -- hero:unfreeze()
    -- end)
   should_continue = true
   
   sol.timer.start(self:get_map(), 10, function()
     if direction4 == 0 then x = x + 1
     elseif direction4 == 1 then y = y -1
     elseif direction4 == 2 then x = x - 1
     else y = y + 1
     end
    
      print "06"
     bullet:set_position(x, y, layer)
    
     bullet:add_collision_test("overlapping", function(bullet, entity)
      
      distance = distance + 1
      if distance >150 then
        should_continue = false
      end
      
      if entity:get_type() ~= "enemy" then
        sol.audio.play_sound("sword_tapping")
        should_continue = false
        return
      elseif entity:get_type() == "enemy" then
        enemy.hurt(3)
        should_continue = false
        return
      end
      end)
     return should_continue
   end)
   
  end
  bullet.remove()
  print "08"
  hero:unfreeze()
  self:set_finished()
end

function item:on_obtaining(variant, savegame_variable)
  print "putain ça passe !!!"
  local bullet_bag = self:get_game():get_item("bullet_bag")
  if not bullet_bag:has_variant() then
    -- Give the first bullet_bag automatically with the slingshot
   bullet_bag:set_variant(1)
  end
end

[/spoiler]

Tu as un timer qui se répète toutes les 10 millisecondes et qui joue un son à chaque fois. Je ne pense pas que ce soit voulu de jouer le son 100 fois par seconde ^^
Ceci dit c'est une erreur qui ça ne devrait pas faire planter le jeu mais juste afficher un message. Ce sera corrigé dans la prochaine version.
En tout cas je pense qu'il y a des choses qui ne vont pas, par exemple dans ce timer tu ajoutes un test de collision à chaque fois. Le test de collision n'a besoin d'être configuré qu'une fois.
Chaîne Twitch : diffusion en direct de sessions de développement de Solarus, de création de jeux, de parties de jeux vidéo.
Chaîne YouTube : replays des diffusions en direct, tutos Solarus
Compte Twitter : pour être au courant des nouveautés
Chat Discord : pour discuter en direct avec la communauté Solarus

Oui, le add_collision_test dans le timer c'est carrement une boulette, en revanche je ne joue le son que s'il rencontre une entity, et je sors:

if entity:get_type() ~= "enemy" then
  sol.audio.play_sound("sword_tapping")
  should_continue = false
return
elseif entity:get_type() == "enemy" then
  enemy.hurt(3)
  should_continue = false
  return
end

Hum, sauf que le play_sound est dans le callback de add_collision_test, donc finalement il est appelé en continu tant que la collision a lieu. Si tu enlèves le play_sound ça ne plante plus je suppose ?
Chaîne Twitch : diffusion en direct de sessions de développement de Solarus, de création de jeux, de parties de jeux vidéo.
Chaîne YouTube : replays des diffusions en direct, tutos Solarus
Compte Twitter : pour être au courant des nouveautés
Chat Discord : pour discuter en direct avec la communauté Solarus

Effectivement, ça ne plante plus :P
Je pensais assez naivement, qu'au premier test de collision vrai, il sortait.
Je verrai bien par la suite, pour appeler un son en dehors de cette boucle (mais une fois que j'aurai corriger toutes les autres erreurs, et il y en a !).

J'avais entendu parler du Lua avant ça, mais je n'avais jamais tester; c'est un bon moyen de se faire la main  :D

En tout ca, merci pour la rapidité de ta réponse, maintenant, je peux continuer à chercher en toute quiétude.

Avec plaisir. Et bienvenue sur Solarus ^^
Chaîne Twitch : diffusion en direct de sessions de développement de Solarus, de création de jeux, de parties de jeux vidéo.
Chaîne YouTube : replays des diffusions en direct, tutos Solarus
Compte Twitter : pour être au courant des nouveautés
Chat Discord : pour discuter en direct avec la communauté Solarus