gameActorStatePlayerOnPush.lua 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. local gameActorState = require( "actor/gameActorState")
  2. local gameActorStatePlayerOnPush = class('gameActorStatePlayerOnPush', gameActorState)
  3. local mMin = math.min
  4. local mAbs = math.abs
  5. local mFloor = math.floor
  6. local mRound = math.round
  7. function gameActorStatePlayerOnPush:ctor()
  8. gameActorStatePlayerOnPush.super.ctor(self)
  9. end
  10. function gameActorStatePlayerOnPush:GetStateID()
  11. return global.MMO.ACTION_ONPUSH
  12. end
  13. function gameActorStatePlayerOnPush:Tick(dt, actor)
  14. actor.mCurrentActT = actor.mCurrentActT - dt
  15. actor.mOnPushIdleT = actor.mOnPushIdleT - dt
  16. if not actor.mIsArrived then
  17. -- Timing...
  18. if actor.mCurrentActT <= 0.0 then
  19. actor:SetIsArrived(true)
  20. end
  21. -- displacement
  22. local percent = (actor.mMoveTime - actor.mCurrentActT) / actor.mMoveTime
  23. percent = mMin(1, percent)
  24. local disp = percent * actor.mDistanceToTarget
  25. local dispV = cc.pAdd( cc.p(actor.originPosition), cc.pMul(actor.mMoveOrient, disp) )
  26. if global.isWinPlayMode and actor:IsPlayer() and actor:IsMainPlayer() then
  27. dispV.x = mRound(dispV.x)
  28. dispV.y = mRound(dispV.y)
  29. end
  30. actor:setPosition( dispV.x, dispV.y )
  31. -- idle anim
  32. if actor.mIsArrived and actor.mOnPushIdleT > 0 then
  33. actor:SetAnimAct(global.MMO.ANIM_IDLE)
  34. actor:dirtyAnimFlag()
  35. end
  36. end
  37. if actor.mActionHandler then
  38. if actor.mIsArrived and actor.mOnPushIdleT <= 0 then
  39. actor.mActionHandler:handleActionCompleted( actor, self:GetStateID() )
  40. else
  41. actor.mActionHandler:handleActionProcess( actor, self:GetStateID(), dt )
  42. end
  43. end
  44. end
  45. function gameActorStatePlayerOnPush:OnEnter(actor)
  46. if actor.mActionHandler then
  47. actor.mActionHandler:handleActionBegin( actor, self:GetStateID() )
  48. end
  49. local currPos = cc.p(actor:getPosition())
  50. local targPos = global.sceneManager:MapPos2WorldPos( actor:GetMapX(), actor:GetMapY(), true )
  51. actor.mTargePos = targPos
  52. actor.mMoveOrient = cc.pSub(targPos, currPos)
  53. actor.mDistanceToTarget = cc.pGetLength(actor.mMoveOrient)
  54. actor.mMoveOrient = cc.pNormalize(actor.mMoveOrient)
  55. actor.mMoveTime = actor.mCurrentActT
  56. actor.originPosition = actor:getPosition()
  57. actor.mIsArrived = false
  58. actor.mOnPushIdleT = actor.mOnPushIdleT + actor.mCurrentActT
  59. -- reset some data
  60. actor:SetAnimPrepare( 0.0 )
  61. actor:dirtyAnimFlag()
  62. end
  63. function gameActorStatePlayerOnPush:OnExit(actor)
  64. actor.mCurrentActT = 0
  65. actor.mOnPushIdleT = 0
  66. -- reset some data
  67. actor:SetAnimPrepare( 0.0 )
  68. actor:dirtyAnimFlag()
  69. end
  70. function gameActorStatePlayerOnPush:ChangeState(newState, actor, isTerminate)
  71. actor.mCurrentState = newState
  72. return true
  73. end
  74. return gameActorStatePlayerOnPush