Sprite = {} Sprite.__index = Sprite function Sprite.new(tex_name, opts) local self = setmetatable({}, Sprite) opts = opts or {} self.tex = get_tex(tex_name) self.anim = get_anim(tex_name) self.active_tag = self.anim.default_tag self.frame = self.anim.tags[self.active_tag].from self.timer = 0 local width, height = self.tex:getDimensions() self.width = width / self.anim.frame_count self.height = height local offsetx = opts.offsetx or 0 local offsety = opts.offsety or 0 if offsetx < 1 and offsetx > -1 then self.offsetx = self.width * offsetx else self.offsetx = offsetx end if offsety < 1 and offsety > -1 then self.offsety = self.height * offsety else self.offsety = offsety end return self end function Sprite:set_tag(name) assert(self.anim.tags[name], "Sprite does not have tag '" .. name .. "'.") self.active_tag = name end register_comp("Sprite", function(ent, tex_name, opts) ent.sprite = Sprite.new(tex_name, opts) end) function sprite_anim_sys(ent, dt) local sprite = ent.sprite local tag = sprite.anim.tags[sprite.active_tag] local frame_duration = sprite.anim.frame_durations[sprite.frame] sprite.timer = sprite.timer + dt if sprite.timer > frame_duration then sprite.frame = sprite.frame + 1 sprite.timer = sprite.timer - frame_duration end if sprite.frame >= tag.to then sprite.frame = tag.from end if sprite.frame < tag.from then sprite.frame = tag.from end end function sprite_draw_sys(ent) local sprite = ent.sprite local q = lg.newQuad( sprite.width * sprite.frame, 0, sprite.width, sprite.height, sprite.tex:getDimensions() ) lg.setColor(1, 1, 1) lg.draw( sprite.tex, q, ent.x or 0, ent.y or 0, ent.rotation or 0, ent.scalex or ent.scale or 1, ent.scaley or ent.scale or 1, sprite.offsetx, sprite.offsety, ent.shearx or 0, ent.sheary or 0 ) end