animator.lua 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. Skeleton = class()
  2. function Skeleton:init(data)
  3. local json = spine.SkeletonJson.new()
  4. json.scale = data.scale
  5. self.data = json:readSkeletonDataFile('media/skeletons/' .. data.name .. '/' .. data.name .. '.json')
  6. self.skeleton = spine.Skeleton.new(self.data)
  7. function self.skeleton:createImage(attachment)
  8. return love.graphics.newImage('media/skeletons/' .. data.name .. '/' .. attachment.name .. '.png')
  9. end
  10. self.x = data.x
  11. self.skeleton.x = data.x
  12. self.y = data.y
  13. self.skeleton.y = data.y
  14. self.skeleton:setToSetupPose()
  15. end
  16. Animator = class()
  17. function Animator:init(data)
  18. if data then
  19. if getmetatable(data.skeleton).__index == Skeleton then
  20. self.skeleton = data.skeleton.skeleton
  21. self.stateData = spine.AnimationStateData.new(data.skeleton.data)
  22. if data.mixes then
  23. table.each(data.mixes, function(mix)
  24. self.stateData:setMix(mix.from, mix.to, mix.time)
  25. end)
  26. end
  27. self.state = spine.AnimationState.new(self.stateData)
  28. else
  29. return
  30. end
  31. end
  32. end
  33. function Animator:add(name, loop, track)
  34. if not track then track = 0 end
  35. if self.state then
  36. self.state:addAnimationByName(track, name, loop, 0)
  37. end
  38. end
  39. function Animator:set(name, loop, track)
  40. if not track then track = 0 end
  41. if self.state then
  42. self.state:setAnimationByName(track, name, loop, 0)
  43. end
  44. end
  45. function Animator:update(delta)
  46. if self.state and self.skeleton then
  47. self.state:update(delta)
  48. self.state:apply(self.skeleton)
  49. self.skeleton:updateWorldTransform()
  50. end
  51. end
  52. function Animator:draw()
  53. if self.skeleton then
  54. self.skeleton:draw()
  55. end
  56. end