源战役客户端
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

165 linhas
5.2 KiB

  1. SourceOperateTargetAction = SourceOperateTargetAction or BaseClass(SourceOperateMove)
  2. local SourceOperateTargetAction = SourceOperateTargetAction
  3. --[[@
  4. : SourceOperateTargetAction的初始化函数
  5. :
  6. target_compress_id ID int32
  7. range numeric
  8. action_func function
  9. action_period_func , function
  10. action_end_func function
  11. clear_func function
  12. :
  13. :
  14. : deadline
  15. ]]
  16. function SourceOperateTargetAction:__init(target_compress_id, range, action_func, action_period_func, action_end_func, clear_func,scene_obj)
  17. self.type = OperateManager.SourceOperateType.TargetAction
  18. self.init_time = 0
  19. self.target_compress_id = target_compress_id
  20. self.range = range
  21. self.action_func = action_func
  22. self.action_period_func = action_period_func
  23. self.action_end_func = action_end_func
  24. self.clear_func = clear_func
  25. self.scene_obj = scene_obj
  26. self.is_path_valid = false
  27. self.path_list = nil
  28. self.total_pair = 0
  29. --最后一次动作时间
  30. self.last_action_time = 0
  31. end
  32. function SourceOperateTargetAction:__delete( )
  33. if self.clear_func ~= nil then
  34. self.clear_func()
  35. end
  36. end
  37. function SourceOperateTargetAction:GetTargetObj( )
  38. return Scene.Instance:GetObjByCompressedId(self.target_compress_id)
  39. end
  40. --[[@
  41. : ,
  42. :
  43. :
  44. true表示初始化成功, false表示初始化失败
  45. :
  46. : deadline
  47. ]]
  48. function SourceOperateTargetAction:Init()
  49. self.init_time = Status.NowTime
  50. self.path_list = {}
  51. --查看目标对象是否在场景中
  52. local obj = self:GetTargetObj()
  53. if obj == nil then
  54. --print("SourceOperateTargetAction:Init can not find target obj")
  55. return false
  56. end
  57. --print("target action init suc!")
  58. return true
  59. end
  60. --[[@
  61. : SourceOperate中获取一个NowOperate控制角色行为
  62. :
  63. :
  64. NowOperate
  65. :
  66. : deadline
  67. ]]
  68. function SourceOperateTargetAction:GetOperImpl()
  69. --print("excute target action")
  70. local now_oper = nil
  71. local now_time = Status.NowTime
  72. --判断目标对象是否已经不存在
  73. local target_obj = self:GetTargetObj()
  74. if target_obj == nil then
  75. self.is_finish = true
  76. --print("target action can not find target!")
  77. -- GlobalEventSystem:Fire(SceneEventType.ACTION_TARGET_MISSING)
  78. --目标不存在会导致auto_find_way不会重置
  79. local scene_obj = self.scene_obj or Scene.Instance:GetMainRole()
  80. if scene_obj and scene_obj:GetType() == SceneBaseType.MainRole then
  81. GlobalEventSystem:Fire(EventName.FINDWAY_ENDED)
  82. end
  83. return self:GenerateNop(0.2)
  84. end
  85. --重新以主角当前位置作为寻路起始位置
  86. local scene_obj = self.scene_obj or Scene.Instance:GetMainRole()
  87. local x1, y1 = scene_obj:GetRealPos()
  88. local x2, y2 = target_obj:GetRealPos()
  89. -- local distance = dir:length()
  90. local distance = GameMath.GetDistance(x1, y1, x2, y2, false)
  91. --print("= = = = SourceOperateTargetAction: dist:", distance, self.range)
  92. --距离在可动作范围内
  93. if distance <= self.range * self.range then
  94. --在这停止移动
  95. if scene_obj:GetType() == SceneBaseType.MainRole then
  96. local real_pos = co.Vector2(scene_obj:GetRealPos())
  97. if scene_obj.move_flag == MOVE_TYPE.ACCELERATE then
  98. EventSystem.Fire(GlobalEventSystem, SceneEventType.MOVEREQUEST, real_pos.x, real_pos.y, MOVE_TYPE.ACCELERATE)
  99. else
  100. EventSystem.Fire(GlobalEventSystem, SceneEventType.MOVEREQUEST, real_pos.x, real_pos.y, MOVE_TYPE.NORMOL_MOVE)
  101. end
  102. end
  103. local dir = co.TempVector2(x2-x1, y2-y1)
  104. scene_obj:SetDirection(dir)
  105. scene_obj:WaitForNextMove()
  106. -- print(string.format("= = = = Action_func():(%.2f, %.2f), (%.2f, %.2f)", start_logic_pos.x, start_logic_pos.y, end_logic_pos.x, end_logic_pos.y))
  107. if self.action_func then
  108. self.action_func() --执行相关动作
  109. end
  110. self.last_action_time = Status.NowTime
  111. now_oper = self:GenerateNop(0.2)
  112. self.is_finish = true
  113. dir:DeleteV()
  114. else
  115. --当前的起始坐标和终点坐标,必须用RealPos计算才能准确
  116. local start_logic_pos = co.Vector2(scene_obj:GetLogicPos())
  117. local end_logic_pos = co.Vector2(target_obj:GetLogicPos())
  118. --范围外,执行寻路
  119. -- if not self.is_path_valid or self.now_use_pair > self.total_pair then
  120. --重新计算路径
  121. self.path_list = {}
  122. -- print("= = = = 重新寻路")
  123. if not self:RecalcPathInfo(start_logic_pos, end_logic_pos, 0) then
  124. self.is_finish = true
  125. print("计算路径失败直接停止该操作包")
  126. return self:GenerateNop(0.2) --计算路径失败直接停止该操作包(怪卡障碍点或者自己卡障碍点)
  127. end
  128. -- end
  129. --取出下一个小路径执行
  130. local move_pair = self.path_list[self.now_use_pair]
  131. if move_pair == nil then
  132. self.is_finish = true
  133. return self:GenerateNop(0.2)
  134. end
  135. -- print(string.format("= = = new pair:%d (%.2f, %.2f) (%.2f, %.2f)", self.now_use_pair, move_pair.start_point.x, move_pair.start_point.y, move_pair.end_point.x, move_pair.end_point.y))
  136. now_oper = NowOperateTargetMove.New(now_time, move_pair.start_point, move_pair.end_point, target_obj, self.range,scene_obj)
  137. self.now_use_pair = self.now_use_pair + 1
  138. end
  139. return now_oper
  140. end