gameActorStatePlayerDash.lua 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. local gameActorState = require( "actor/gameActorState")
  2. local gameActorStatePlayerDash = class('gameActorStatePlayerDash', gameActorState)
  3. local mMin = math.min
  4. local mAbs = math.abs
  5. local mFloor = math.floor
  6. local mRound = math.round
  7. local MOVETO_GHOST_FADEOUT_TIME = 0.7
  8. local MOVETO_GHOST_INTERVAL = 0.15
  9. function gameActorStatePlayerDash:ctor()
  10. gameActorStatePlayerDash.super.ctor(self)
  11. end
  12. function gameActorStatePlayerDash:GetStateID()
  13. return global.MMO.ACTION_DASH
  14. end
  15. function gameActorStatePlayerDash:Tick(dt, actor)
  16. actor._ghostTime = actor._ghostTime - dt
  17. if actor._ghostTime <= 0.00001 then
  18. actor._ghostTime = actor._ghostInterval
  19. local position = cc.p(actor:getPosition())
  20. local anchorPos = cc.p(0.5, 0.5)
  21. local anim = nil
  22. local isMonster = true
  23. -- monster
  24. anim = actor:GetAnimationMonster()
  25. if anim then
  26. anchorPos = anim:GetStandPoint()
  27. self:ghostSprite(anim:getSpriteFrame(), position, anchorPos, anim)
  28. isMonster = false
  29. end
  30. -- anchor pos is same of weapon/wings
  31. anim = actor:GetAnimation()
  32. if isMonster and anim then
  33. anchorPos = anim:GetStandPoint()
  34. self:ghostSprite(anim:getSpriteFrame(), position, anchorPos, anim)
  35. isMonster = false
  36. end
  37. anim = actor:GetAnimationWeapon()
  38. if isMonster and anim then
  39. anchorPos = anim:GetStandPoint()
  40. self:ghostSprite(anim:getSpriteFrame(), position, anchorPos, anim)
  41. end
  42. anim = actor:GetAnimationShield()
  43. if isMonster and anim then
  44. anchorPos = anim:GetStandPoint()
  45. self:ghostSprite(anim:getSpriteFrame(), position, anchorPos, anim)
  46. end
  47. anim = actor:GetAnimationWings()
  48. if isMonster and anim then
  49. anchorPos = anim:GetStandPoint()
  50. self:ghostSprite(anim:getSpriteFrame(), position, anchorPos, anim)
  51. end
  52. anim = actor:GetAnimationHair()
  53. if isMonster and anim then
  54. anchorPos = anim:GetStandPoint()
  55. self:ghostSprite(anim:getSpriteFrame(), position, anchorPos, anim)
  56. end
  57. end
  58. actor.mCurrentActT = actor.mCurrentActT - dt
  59. if not actor.mIsArrived then
  60. -- Timing...
  61. if actor.mCurrentActT <= 0.0 then
  62. actor:SetIsArrived(true)
  63. end
  64. -- displacement
  65. local percent = (actor.mMoveTime - actor.mCurrentActT) / actor.mMoveTime
  66. percent = mMin(1, percent)
  67. local disp = percent * actor.mDistanceToTarget
  68. local dispV = cc.pAdd( cc.p(actor.originPosition), cc.pMul(actor.mMoveOrient, disp) )
  69. if global.isWinPlayMode and actor:IsPlayer() and actor:IsMainPlayer() then
  70. dispV.x = mRound(dispV.x)
  71. dispV.y = mRound(dispV.y)
  72. end
  73. actor:setPosition( dispV.x, dispV.y )
  74. end
  75. if actor.mActionHandler then
  76. if actor.mIsArrived then
  77. actor.mActionHandler:handleActionCompleted( actor, self:GetStateID() )
  78. else
  79. actor.mActionHandler:handleActionProcess( actor, self:GetStateID(), dt )
  80. end
  81. end
  82. end
  83. function gameActorStatePlayerDash:OnEnter(actor,param)
  84. if actor.mActionHandler then
  85. actor.mActionHandler:handleActionBegin( actor, self:GetStateID() )
  86. end
  87. local currPos = cc.p(actor:getPosition())
  88. local targPos = global.sceneManager:MapPos2WorldPos( actor:GetMapX(), actor:GetMapY(), true )
  89. actor.mTargePos = targPos
  90. actor.mMoveOrient = cc.pSub(targPos, currPos)
  91. actor.mDistanceToTarget = cc.pGetLength(actor.mMoveOrient)
  92. actor.mMoveOrient = cc.pNormalize(actor.mMoveOrient)
  93. actor.mMoveTime = actor.mCurrentActT
  94. actor.originPosition = actor:getPosition()
  95. actor.mIsArrived = false
  96. actor._ghostTime = 0
  97. actor._ghostInterval = MOVETO_GHOST_INTERVAL
  98. -- reset some data
  99. actor:SetAnimPrepare( 0.0 )
  100. actor:dirtyAnimFlag()
  101. end
  102. function gameActorStatePlayerDash:OnExit(actor)
  103. actor.mCurrentActT = 0
  104. -- reset some data
  105. actor:SetAnimPrepare( 0.0 )
  106. actor:dirtyAnimFlag()
  107. end
  108. function gameActorStatePlayerDash:ChangeState(newState, actor, isTerminate)
  109. actor.mCurrentState = newState
  110. return true
  111. end
  112. function gameActorStatePlayerDash:ghostSprite(frame, pos, anchorPos, anim)
  113. if not frame then
  114. return
  115. end
  116. local ghost = cc.Sprite:createWithSpriteFrame(frame)
  117. if ghost then
  118. local behind_sfx_node = global.sceneGraphCtl:GetSceneNode(global.MMO.NODE_ACTOR_SFX_FRONT)
  119. behind_sfx_node:addChild(ghost)
  120. local offset = anim:GetOffset()
  121. local pos = cc.pAdd(pos, offset)
  122. ghost:setPosition(cc.pAdd(pos, global.MMO.PLAYER_AVATAR_OFFSET))
  123. ghost:setAnchorPoint(anchorPos)
  124. ghost:setBlendFunc(anim:getBlendFunc())
  125. local function FadeOutEnd()
  126. ghost:removeFromParent()
  127. end
  128. local fo = cc.FadeOut:create(MOVETO_GHOST_FADEOUT_TIME)
  129. local seq = cc.Sequence:create(fo, cc.CallFunc:create(FadeOutEnd))
  130. ghost:runAction(seq)
  131. end
  132. end
  133. return gameActorStatePlayerDash