chiro.lua 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. local chiro = {}
  2. chiro.__index = chiro
  3. function chiro.create(config)
  4. local self = setmetatable(config, chiro)
  5. local name = self.dir:match('[^%/]+$')
  6. if self.dir then
  7. self.json = self.json or (self.dir .. '/' .. name .. '.json')
  8. end
  9. local loader = function (path) return love.graphics.newImage(self.dir .. '/' .. path) end
  10. local atlas = spine.TextureAtlas.new(spine.utils.readFile(self.dir .. '/' .. name .. ".atlas"), loader)
  11. self.skeletonJson = spine.SkeletonJson.new(spine.AtlasAttachmentLoader.new(atlas))
  12. self.skeletonJson.scale = self.scale or 1
  13. if type(self.json) == 'table' then
  14. self.skeletonData = self.skeletonJson:readSkeletonData(self.json)
  15. else
  16. self.skeletonData = self.skeletonJson:readSkeletonDataFile(self.json)
  17. end
  18. self.skeleton = spine.Skeleton.new(self.skeletonData)
  19. self.animationStateData = spine.AnimationStateData.new(self.skeletonData)
  20. self.animationState = spine.AnimationState.new(self.animationStateData)
  21. self.skeleton:setToSetupPose()
  22. for name, state in pairs(self.states) do
  23. state.name = name
  24. end
  25. self.on = self.on or {}
  26. self.animationState.onStart = function(entry)
  27. local name = entry.animation.name
  28. local state = self.states[name]
  29. if state and self.on.start then
  30. self.on.start(self, state)
  31. end
  32. end
  33. self.animationState.onEvent = function(_, event)
  34. local name = event.data.name
  35. if self.on[name] then
  36. self.on[name](self, event)
  37. end
  38. end
  39. self.animationState.onEnd = function(entry)
  40. local name = entry.animation.name
  41. local state = self.states[name]
  42. if state then
  43. if self.on['end'] then
  44. self.on['end'](self, state)
  45. end
  46. state.active = false
  47. if state.next then
  48. self:set(state.next)
  49. end
  50. end
  51. end
  52. self.animationState.onComplete = function(entry)
  53. local name = entry.animation.name
  54. local state = self.states[name]
  55. if state and self.on.complete then
  56. self.on.complete(self, state)
  57. end
  58. end
  59. self:resetTo(self.default)
  60. self.skeletonRenderer = spine.SkeletonRenderer.new(true)
  61. return self
  62. end
  63. function chiro:draw(x, y)
  64. x = (x or self.x or 0) + (self.offset and self.offset.x or 0)
  65. y = (y or self.y or 0) + (self.offset and self.offset.y or 0)
  66. local skeleton = self.skeleton
  67. skeleton.x, skeleton.y = x, y
  68. if type(self.flip) == 'table' then
  69. skeleton.flipX = self.flip.x
  70. skeleton.flipY = not self.flip.y
  71. else
  72. skeleton.flipX = self.flip
  73. skeleton.flipY = true
  74. end
  75. skeleton:updateWorldTransform()
  76. self.skeletonRenderer:draw(skeleton)
  77. end
  78. function chiro:update(delta)
  79. self.animationState.timeScale = self.speed or 1
  80. for _, track in ipairs(self.animationState.tracks) do
  81. if track then
  82. local animation = track.animation
  83. local state = self.states[animation.name]
  84. if state.length then
  85. local speed = animation.duration / state.length
  86. track.timeScale = speed
  87. else
  88. track.timeScale = state.speed or 1
  89. end
  90. end
  91. end
  92. self.animationState:update(delta)
  93. self.animationState:apply(self.skeleton)
  94. end
  95. function chiro:resetTo(name)
  96. self:clear()
  97. self:set(name)
  98. end
  99. function chiro:set(name)
  100. if not name then return end
  101. local state = self.states[name]
  102. if state and not state.active then
  103. local track = state.track or 0
  104. local loop = state.loop
  105. state.active = true
  106. self.animationState:setAnimationByName(track, name, loop)
  107. end
  108. end
  109. function chiro:clear()
  110. self.animationState:clearTracks()
  111. end
  112. return chiro