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.
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 ?
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 ^^