Retour à l'accueil
Accueil Aide Rechercher Calendrier Identifiez-vous Inscrivez-vous
Bienvenue, Invité. Veuillez vous connecter ou vous inscrire.
Avez-vous perdu votre courriel d'activation?
15 Novembre 2019 à 11:51

Connexion avec identifiant, mot de passe et durée de la session
Règlement | Grades du forum | L'équipe de modération | Album photo | Chat
Rechercher:     avancée
Forums Zelda Solarus  |  Jeux amateurs  |  Aide & support  |  Topic: [BUG] pb sur un item personnalisé 0 Membres et 1 Invité sur ce sujet.
Pages: [1] Imprimer
Auteur Sujet: [BUG] pb sur un item personnalisé  (Lu 3724 fois)
oldm4n
Bourgeon Mojo
*
Offline Offline

Messages: 3


Courriel
« le: 07 Août 2015 à 20:30 »

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]
« Dernière édition: 07 Août 2015 à 20:54 par oldm4n » Journalisée
Christopho
Administrateur
Héros
*
Offline Offline

Messages: 6 212


Mymy, je t'aime :)


WWW Courriel
« Répondre #1 le: 07 Août 2015 à 20:47 »

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.
Journalisée

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
oldm4n
Bourgeon Mojo
*
Offline Offline

Messages: 3


Courriel
« Répondre #2 le: 07 Août 2015 à 20:53 »

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
Journalisée
Christopho
Administrateur
Héros
*
Offline Offline

Messages: 6 212


Mymy, je t'aime :)


WWW Courriel
« Répondre #3 le: 07 Août 2015 à 21:07 »

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 ?
Journalisée

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
oldm4n
Bourgeon Mojo
*
Offline Offline

Messages: 3


Courriel
« Répondre #4 le: 07 Août 2015 à 21:24 »

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.
Journalisée
Christopho
Administrateur
Héros
*
Offline Offline

Messages: 6 212


Mymy, je t'aime :)


WWW Courriel
« Répondre #5 le: 07 Août 2015 à 21:27 »

Avec plaisir. Et bienvenue sur Solarus ^^
Journalisée

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
Pages: [1] Imprimer 
Forums Zelda Solarus  |  Jeux amateurs  |  Aide & support  |  Topic: [BUG] pb sur un item personnalisé
Aller à:  

Propulsé par MySQL Propulsé par PHP Powered by SMF 2.0.15 | SMF © 2006, Simple Machines LLC XHTML 1.0 Transitionnel valide ! CSS valide !
Zelda Solarus 2009Skin par Eidarloy
Solarus-Games