animation.lua 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. Animation = class()
  2. Animation.defaultMix = .2
  3. function Animation:init(vars)
  4. table.merge(vars, self, true)
  5. self:initSpine(self.code)
  6. self.event = Event()
  7. self.spine.animationState.onComplete = function() self.event:emit('complete', {state = self.state}) end
  8. self.spine.animationState.onEvent = function(_, data) self.event:emit('event', data) end
  9. self:set(self.default)
  10. self.speed = 1
  11. self.flipped = false
  12. end
  13. function Animation:draw(x, y, options)
  14. options = options or {}
  15. local skeleton, animationState = self.spine.skeleton, self.spine.animationState
  16. self:setPosition(x, y)
  17. skeleton.flipX = self.flipped
  18. if self.backwards then skeleton.flipX = not skeleton.flipX end
  19. if not options.noupdate then self:tick(ls.dt) end
  20. animationState:apply(skeleton)
  21. local root = skeleton:getRootBone()
  22. if root then
  23. root.scaleX = self.scale
  24. root.scaleY = self.scale
  25. end
  26. skeleton:updateWorldTransform()
  27. skeleton:draw()
  28. if options.debug then
  29. table.each(self.spine.skeleton.slots, function(slot)
  30. slot:setAttachment(self.spine.skeleton:getAttachment(slot.data.name, slot.data.name .. '_bb'))
  31. self.spine.skeleton.flipY = true
  32. end)
  33. skeleton:updateWorldTransform()
  34. self.spine.skeletonBounds:update(self.spine.skeleton)
  35. love.graphics.setColor(255, 255, 255)
  36. for i = 1, #self.spine.skeletonBounds.polygons do
  37. love.graphics.polygon('line', self.spine.skeletonBounds.polygons[i])
  38. end
  39. table.each(self.spine.skeleton.slots, function(slot)
  40. slot:setAttachment(self.spine.skeleton:getAttachment(slot.data.name, slot.data.name))
  41. self.spine.skeleton.flipY = false
  42. end)
  43. end
  44. end
  45. function Animation:tick(delta)
  46. self.spine.animationState:update(delta * (self.state.speed or 1) * self.speed)
  47. self.spine.animationState:apply(self.spine.skeleton)
  48. end
  49. function Animation:setPosition(x, y)
  50. local skeleton = self.spine.skeleton
  51. skeleton.x = x + (self.offsetx or 0)
  52. skeleton.y = y + (self.offsety or 0)
  53. end
  54. function Animation:set(name, options)
  55. if type(name) == 'number' and self.states[name] then name = self.states[name].name end
  56. if not name or not self.states[name] then return end
  57. options = options or {}
  58. local target = self.states[name]
  59. if self.state and self.state.name == target.name then return end
  60. self.state = target
  61. if self.spine.skeletonData:findAnimation(self.state.name) then
  62. self.spine.animationState:setAnimationByName(0, self.state.name, self.state.loop)
  63. end
  64. end
  65. function Animation:contains(x, y)
  66. do return false end
  67. table.each(self.spine.skeleton.slots, function(slot)
  68. slot:setAttachment(self.spine.skeleton:getAttachment(slot.data.name, slot.data.name .. '_bb'))
  69. end)
  70. self.spine.skeleton.flipY = true
  71. self.spine.skeleton:updateWorldTransform()
  72. self.spine.skeletonBounds:update(self.spine.skeleton)
  73. self.spine.skeleton.flipY = false
  74. local contains = self.spine.skeletonBounds:containsPoint(x, y)
  75. table.each(self.spine.skeleton.slots, function(slot)
  76. slot:setAttachment(self.spine.skeleton:getAttachment(slot.data.name, slot.data.name))
  77. end)
  78. return contains
  79. end
  80. function Animation:initSpine()
  81. local s = setmetatable({}, data.animation[self.code].spine)
  82. s.skeleton = spine.Skeleton.new(s.skeletonData)
  83. s.skeletonBounds = spine.SkeletonBounds.new()
  84. s.animationState = spine.AnimationState.new(s.animationStateData)
  85. s.skeleton:setToSetupPose()
  86. s.skeleton.createImage = function(_, attachment)
  87. return self.graphics[attachment.name]
  88. end
  89. s.skeleton.createAtlasImage = function(_, page)
  90. return self.graphics[page.name:gsub('.png', ''):gsub('.dds', '')]
  91. end
  92. self.spine = s
  93. end
  94. function Animation:on(...)
  95. return self.event:on(...)
  96. end