skillBehaviorSeq.lua 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. local skillBehavior = require("skill/skillBehavior")
  2. local skillBehaviorSeq = class("skillBehaviorSeq", skillBehavior)
  3. local skillPresentLaunch = require("skill/skillPresentLaunch")
  4. local skillPresentFly = require("skill/skillPresentFly")
  5. local skillPresentHit = require("skill/skillPresentHit")
  6. function skillBehaviorSeq:ctor(id, data, config)
  7. skillBehaviorSeq.super.ctor(self, id, data, config)
  8. self._tickPresents = {}
  9. self._launchPresent = nil
  10. self._flyPresents = {}
  11. self._hitPresents = {}
  12. self._presentTag = 0
  13. end
  14. function skillBehaviorSeq:init()
  15. self._currPresent = nil
  16. end
  17. function skillBehaviorSeq:launch()
  18. skillBehaviorSeq.super.launch(self)
  19. if self._data.skillStage == 1 then
  20. self:joinLaunch()
  21. elseif self._data.skillStage == 2 then
  22. self:joinLaunchOver()
  23. else
  24. self:joinLaunch()
  25. self:joinLaunchOver()
  26. end
  27. if self._data.needFly then
  28. self:joinLaunchFly()
  29. end
  30. -- launch
  31. self:launchBehavior()
  32. end
  33. function skillBehaviorSeq:launchBehavior()
  34. if self._launchPresent then
  35. self._launchPresent:launch()
  36. return true
  37. end
  38. if #self._flyPresents > 0 then
  39. for _, v in pairs(self._flyPresents) do
  40. v:launch()
  41. end
  42. return true
  43. end
  44. return false
  45. end
  46. function skillBehaviorSeq:joinLaunch()
  47. if self._launchPresent then
  48. return nil
  49. end
  50. self._launchPresent = skillPresentLaunch.new(self._data, self._config, self._launchRoot, nil, self)
  51. self._launchPresent:init()
  52. self._launchPresent.tag = self._presentTag
  53. self._presentTag = self._presentTag + 1
  54. end
  55. function skillBehaviorSeq:joinLaunchOver()
  56. if #self._flyPresents > 0 or #self._hitPresents > 0 then
  57. return nil
  58. end
  59. if not self._data.hitX or not self._data.hitY then
  60. return nil
  61. end
  62. local targets = {}
  63. local destPos = cc.p(self._data.hitX, self._data.hitY)
  64. if self._data.param and self._data.param ~= "" then
  65. local slices = string.split(self._data.param, "#")
  66. for _, v in ipairs(slices) do
  67. table.insert(targets, {dest = destPos, id = v})
  68. end
  69. else
  70. table.insert(targets, {dest = destPos, id = nil})
  71. end
  72. for _, target in pairs(targets) do
  73. local flyPresent = skillPresentFly.new(self._data, self._config, self._flyRoot, target, self)
  74. flyPresent:init()
  75. flyPresent.tag = self._presentTag
  76. self._presentTag= self._presentTag + 1
  77. table.insert(self._flyPresents, flyPresent)
  78. if self._config.needTarget ~= 1 or target.id ~= nil then
  79. local hitPresent = skillPresentHit.new(self._data, self._config, self._hitRoot, target, self)
  80. hitPresent:init()
  81. hitPresent.tag = self._presentTag
  82. self._presentTag= self._presentTag + 1
  83. table.insert(self._hitPresents, hitPresent)
  84. flyPresent:setNext({hitPresent})
  85. end
  86. end
  87. -- bind next present
  88. if self._launchPresent then
  89. self._launchPresent:setNext(self._flyPresents)
  90. end
  91. end
  92. function skillBehaviorSeq:joinLaunchFly()
  93. if #self._flyPresents > 0 then
  94. return nil
  95. end
  96. if not self._data.hitX or not self._data.hitY then
  97. return nil
  98. end
  99. local targets = {}
  100. local destPos = cc.p(self._data.hitX, self._data.hitY)
  101. if self._data.param and self._data.param ~= "" then
  102. local slices = string.split(self._data.param, "#")
  103. for _, v in ipairs(slices) do
  104. table.insert(targets, {dest = destPos, id = v})
  105. end
  106. else
  107. table.insert(targets, {dest = destPos, id = nil})
  108. end
  109. for _, target in pairs(targets) do
  110. local flyPresent = skillPresentFly.new(self._data, self._config, self._flyRoot, target, self)
  111. flyPresent:init()
  112. flyPresent.tag = self._presentTag
  113. self._presentTag= self._presentTag + 1
  114. table.insert(self._flyPresents, flyPresent)
  115. end
  116. -- bind next present
  117. if self._launchPresent then
  118. self._launchPresent:setNext(self._flyPresents)
  119. end
  120. end
  121. function skillBehaviorSeq:onLaunch(skillPB)
  122. table.insert(self._tickPresents, skillPB)
  123. end
  124. function skillBehaviorSeq:onFinish(skillPB)
  125. for k, v in pairs(self._tickPresents) do
  126. if v.tag == skillPB.tag then
  127. table.remove(self._tickPresents, k)
  128. break
  129. end
  130. end
  131. --
  132. if #self._tickPresents == 0 then
  133. self:disable()
  134. end
  135. end
  136. function skillBehaviorSeq:Tick(dt)
  137. for _, v in pairs(self._tickPresents) do
  138. v:Tick(dt)
  139. end
  140. end
  141. return skillBehaviorSeq