Page 1 of 1
LuaRenderObject.prototype or prototypes.animation
Posted: Sun Mar 09, 2025 12:28 pm
by jurgy
I'm trying to get the number of frames in an animation. It's stored as the frame_count property of the animation prototype but I believe there's no way to get the prototype of a LuaRenderObject.
There's neither a LuaRenderObject.prototype field nor a table in the prototypes object that contains the animation prototypes.
Let me know if I'm mistaken, but if not, can you please add an interface in the API
Thanks!
Re: LuaRenderObject.prototype or prototypes.animation
Posted: Sun Mar 09, 2025 12:48 pm
by Bilka
What do you want to use the frame_count for?
Re: LuaRenderObject.prototype or prototypes.animation
Posted: Sun Mar 09, 2025 12:49 pm
by curiosity
https://lua-api.factorio.com/latest/cla ... #animation
The exact same property name as on creation.
Or if you mean that animation prototypes are missing from runtime entirely, you should rephrase your request to ask for that.
Re: LuaRenderObject.prototype or prototypes.animation
Posted: Sun Mar 09, 2025 1:04 pm
by jurgy
Bilka wrote: Sun Mar 09, 2025 12:48 pm
What do you want to use the frame_count for?
I posted
another interface request for pausing/restarting animations. In that thread I talked about a script work around. That solution requires the frame count such that you can calculate the frame the animation should be at.
The code is still work in progress, but here's what I currently have to give you an idea:
Code: Select all
local AnimationWrapper = {}
AnimationWrapper.__index = AnimationWrapper
function AnimationWrapper.new(lua_render_object, frame_count)
local self = setmetatable({}, AnimationWrapper)
self.animation = lua_render_object
self.base_speed = 1
self.paused_frame = nil
self.last_start_tick = game.tick
self.frame_count = frame_count
self.animation.animation_speed = self.base_speed
self.animation.animation_offset = (game.tick * self.base_speed) % self.frame_count
return self
end
-- Pause the animation.
-- Capture the current displayed frame and stop the animation.
function AnimationWrapper:pause()
local current_tick = game.tick
local current_frame = (self.animation.animation_offset + current_tick * self.base_speed) % self.frame_count
self.paused_frame = current_frame
self.animation.animation_speed = 0
self.animation.animation_offset = current_frame
end
function AnimationWrapper:start()
local current_tick = game.tick
self.animation.animation_speed = self.base_speed
if self.paused_frame then
self.animation.animation_offset = (self.paused_frame - current_tick * self.base_speed) % self.frame_count
else
self.animation.animation_offset = (current_tick * self.base_speed) % self.frame_count
end
self.last_start_tick = current_tick
self.paused_frame = nil
end
function AnimationWrapper:set_speed(new_speed)
local current_tick = game.tick
if self.animation.animation_speed ~= 0 then
local current_frame = (self.animation.animation_offset + current_tick * self.base_speed) % self.frame_count
self.base_speed = new_speed
self.animation.animation_speed = new_speed
self.animation.animation_offset = (current_frame - current_tick * new_speed) % self.frame_count
self.last_start_tick = current_tick
else
self.base_speed = new_speed
self.animation.animation_speed = 0
end
end
return AnimationWrapper
Re: LuaRenderObject.prototype or prototypes.animation
Posted: Sun Mar 09, 2025 1:06 pm
by jurgy
Yeah, the animation prototype is afaik missing entirely from the runtime. As to why I need the prototype; I need the frame_count of an animation which is stored in it.