Wouaw this is evolving lightspeed fast!
I made a new one using the Smart limbs controls

and this was waaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayyyyyyyyyyyyyyyyyyyy easier than on v0.7!
Congrats this is so cool (yeah I am total hyped by your tool
)
My feedback on the new features:
- I think the smart controls
should also appear when we select a control, here
so we can configure it while testing/moving it. Right now we need to click back (and remember) on the part that created this limb…but then can’t move the control…
- need some explanation in the tool on how to use, and especially on the different parameters of influence, sofness, max stretch and stretch falloff, I played with them but didnt understand everything

- all QOL evolutions are great
Finally, I was thinking again about the defold API for runtime anchors/events, and I think you really dont need more concepts in the Editor. I think you could just add an API in Defold extension that permit to register a callback attached to some parts, the callback beeing called everytime some value of its transforms has changed.
The usage would be something like this in a gameobject script for our hero, so that it has a weapon that is a true game object that will replace the part in the animation:
local spriteloop = require "spriteloop.spriteloop"
--- callback for spriteloop: self is the context passed while registering,
--- part is the part name
--- animation is the currently playing animation
--- data contains all transform data and other useful data (frame number?)
local function weapon_callback(self, part, animation, data)
-- real weapon object follow the hand while animating
go.set_position(data.position, self.weapon_url) -- here position is a vector3 with z=0 already
go.set_rotation(data.rotation, self.weapon_url ) -- here rotation is a quaternion already
-- here we handle events in the animation.
if data.event then
-- for attack, collision of the weapon should be activated only between some frames.
if data.event == 'hit_frame_start' then
-- activate weapon collision object
msg.post(self.weapon_collision, "enable")
elseif data.event == 'hit_frame_end' then
-- deactivate weapon collision object
msg.post(self.weapon_collision, "disable")
elseif data.event == 'weapon_sound' then
play_sound('weapon_sound')
end
end
end
--- for footsteps sound and dust fx:
local function footstep_callback(self, part, animation, data)
if data.event == 'step' then
if part=='left_foot' then
play_sound('normal_foot_sound')
elseif part=='right_foot' then
play_sound('wood_leg_sound') -- it is a pirate!
end
play_fx('dust')
end
end
function init(self)
local component = "#robot"
self.id = go.get_id()
self.weapon_url = msg.url('/weapon')
self.weapon_collision = msg.url('/weapon#collision_object')
-- Register a callback to a part (maybe allow a list of parts?)
-- give component, the part name, the callback, and a context to pass to the callback
-- last argument make the part invisible (not even rendered) so we can replace it with a gameobject (which itself has a sprite). But maybe we want to keep it, for example just attach an FX to it.
spriteloop.register_callback(component, "weapon", weapon_callback, self, true)
spriteloop.register_callback(component, ["left_foot", "righ_foot"], footstep_callback, self)
--- now everytime we play an anim, the callbacks are called at each frame IF data for the specific part has changed
spriteloop.play_anim(component, "attack", { loop = true })
end
With this setup, events could just be a string data in a keyframe for a part, like any other value (but never interpolated).
With this setup, the animation designer can add parts that will behave like an anchor in Defold, but with a mock graphic (it is easier to animate with a real size object!). It can add event name at specific frames (and parts) in the editor for timing of defold events, or saying “play a sound” or “activate FX” etc.
Then everything is handled by Defold in the callback, your extension doesn’t even need to know what it is doing.
This is just a mind experience for now, but with such API we can basically do anything! Maybe it is also missing a callback when the animation is finished, but should be a last argument in the play_anim() call I presume.
And I would finally be able to make the Fighting game I wanted to do, with handling hit and hurt boxes that follow animations! I started to create this kind of game once, but it was too hard to do it without a tool like you are building.
If you add all of that, it will be version 1.0 I guess 