balatro-mods/lovely/dump/engine/animatedsprite.lua
2025-01-19 15:01:49 +08:00

110 lines
3.3 KiB
Lua

LOVELY_INTEGRITY = '8f16206d263b8b20d4f441ae0cdc8450eef3f2bd3b801abb44802f6b1578b809'
--Class
AnimatedSprite = Sprite:extend()
--Class Methods
function AnimatedSprite:init(X, Y, W, H, new_sprite_atlas, sprite_pos)
Sprite.init(self,X, Y, W, H, new_sprite_atlas, sprite_pos)
self.offset = {x = 0, y = 0}
table.insert(G.ANIMATIONS, self)
if getmetatable(self) == AnimatedSprite then
table.insert(G.I.SPRITE, self)
end
end
function AnimatedSprite:rescale()
self.scale_mag = math.min(self.scale.x/self.T.w,self.scale.y/self.T.h)
end
function AnimatedSprite:reset()
self.atlas = G.ANIMATION_ATLAS[self.atlas.name]
self:set_sprite_pos({x = self.animation.x, y = self.animation.y})
end
function AnimatedSprite:set_sprite_pos(sprite_pos)
self.animation = {
x= sprite_pos and sprite_pos.x or 0,
y=sprite_pos and sprite_pos.y or 0,
frames=self.atlas.frames,current=0,
w=self.scale.x, h=self.scale.y}
self.frame_offset = 0
self.current_animation = {
current = 0,
frames = self.animation.frames,
w = self.animation.w,
h = self.animation.h}
self.image_dims = self.image_dims or {}
self.image_dims[1], self.image_dims[2] = self.atlas.image:getDimensions()
self.sprite = love.graphics.newQuad(
0,
self.animation.h*self.animation.y,
self.animation.w,
self.animation.h,
self.image_dims[1], self.image_dims[2])
self.offset_seconds = G.TIMERS.REAL
end
function AnimatedSprite:get_pos_pixel()
self.RETS.get_pos_pixel = self.RETS.get_pos_pixel or {}
self.RETS.get_pos_pixel[1] = self.current_animation.current
self.RETS.get_pos_pixel[2] = self.animation.y
self.RETS.get_pos_pixel[3] = self.animation.w
self.RETS.get_pos_pixel[4] = self.animation.h
return self.RETS.get_pos_pixel
end
function AnimatedSprite:draw_self()
if not self.states.visible then return end
prep_draw(self, 1)
love.graphics.scale(1/self.scale_mag)
love.graphics.setColor(G.C.WHITE)
love.graphics.draw(
self.atlas.image,
self.sprite,
0 ,0,
0,
self.VT.w/(self.T.w),
self.VT.h/(self.T.h)
)
love.graphics.pop()
end
function AnimatedSprite:animate()
local new_frame = math.floor(G.ANIMATION_FPS*(G.TIMERS.REAL - self.offset_seconds))%self.current_animation.frames
if new_frame ~= self.current_animation.current then
self.current_animation.current = new_frame
self.frame_offset = math.floor(self.animation.w*(self.current_animation.current))
self.sprite:setViewport(
self.frame_offset,
self.animation.h*self.animation.y,
self.animation.w,
self.animation.h)
end
if self.float then
self.T.r = 0.02*math.sin(2*G.TIMERS.REAL+self.T.x)
self.offset.y = -(1+0.3*math.sin(0.666*G.TIMERS.REAL+self.T.y))*self.shadow_parrallax.y
self.offset.x = -(0.7+0.2*math.sin(0.666*G.TIMERS.REAL+self.T.x))*self.shadow_parrallax.x
end
end
function AnimatedSprite:remove()
for k, v in pairs(G.ANIMATIONS) do
if v == self then
table.remove(G.ANIMATIONS, k)
end
end
for k, v in pairs(G.I.SPRITE) do
if v == self then
table.remove(G.I.SPRITE, k)
end
end
Sprite.remove(self)
end