SourceOperateTargetAction = SourceOperateTargetAction or BaseClass(SourceOperateMove)
|
|
local SourceOperateTargetAction = SourceOperateTargetAction
|
|
|
|
|
|
--[[@
|
|
功能: SourceOperateTargetAction的初始化函数
|
|
参数:
|
|
target_compress_id 目标的压缩ID int32
|
|
range 范围 numeric
|
|
action_func 动作函数 function
|
|
action_period_func 动作周期函数,获取执行动作的周期 function
|
|
action_end_func 结束动作的条件 function
|
|
clear_func 清理函数 function
|
|
返回值:
|
|
无
|
|
其它: 无
|
|
作者: deadline
|
|
]]
|
|
function SourceOperateTargetAction:__init(target_compress_id, range, action_func, action_period_func, action_end_func, clear_func,scene_obj)
|
|
self.type = OperateManager.SourceOperateType.TargetAction
|
|
|
|
self.init_time = 0
|
|
self.target_compress_id = target_compress_id
|
|
self.range = range
|
|
|
|
self.action_func = action_func
|
|
self.action_period_func = action_period_func
|
|
self.action_end_func = action_end_func
|
|
self.clear_func = clear_func
|
|
self.scene_obj = scene_obj
|
|
|
|
self.is_path_valid = false
|
|
self.path_list = nil
|
|
|
|
self.total_pair = 0
|
|
|
|
--最后一次动作时间
|
|
self.last_action_time = 0
|
|
end
|
|
|
|
function SourceOperateTargetAction:__delete( )
|
|
if self.clear_func ~= nil then
|
|
self.clear_func()
|
|
end
|
|
end
|
|
|
|
function SourceOperateTargetAction:GetTargetObj( )
|
|
return Scene.Instance:GetObjByCompressedId(self.target_compress_id)
|
|
end
|
|
|
|
--[[@
|
|
功能: 执行初始化操作, 产生一些基准数据
|
|
参数:
|
|
无
|
|
返回值:
|
|
为true表示初始化成功, 为false表示初始化失败
|
|
其它: 无
|
|
作者: deadline
|
|
]]
|
|
function SourceOperateTargetAction:Init()
|
|
self.init_time = Status.NowTime
|
|
self.path_list = {}
|
|
|
|
--查看目标对象是否在场景中
|
|
local obj = self:GetTargetObj()
|
|
if obj == nil then
|
|
--print("SourceOperateTargetAction:Init can not find target obj")
|
|
return false
|
|
end
|
|
|
|
--print("target action init suc!")
|
|
return true
|
|
end
|
|
|
|
--[[@
|
|
功能: 用于从SourceOperate中获取一个NowOperate控制角色行为
|
|
参数:
|
|
无
|
|
返回值:
|
|
当前操作包 NowOperate
|
|
其它: 无
|
|
作者: deadline
|
|
]]
|
|
function SourceOperateTargetAction:GetOperImpl()
|
|
--print("excute target action")
|
|
|
|
local now_oper = nil
|
|
local now_time = Status.NowTime
|
|
|
|
--判断目标对象是否已经不存在
|
|
local target_obj = self:GetTargetObj()
|
|
if target_obj == nil then
|
|
self.is_finish = true
|
|
--print("target action can not find target!")
|
|
-- GlobalEventSystem:Fire(SceneEventType.ACTION_TARGET_MISSING)
|
|
--目标不存在会导致auto_find_way不会重置
|
|
local scene_obj = self.scene_obj or Scene.Instance:GetMainRole()
|
|
if scene_obj and scene_obj:GetType() == SceneBaseType.MainRole then
|
|
GlobalEventSystem:Fire(EventName.FINDWAY_ENDED)
|
|
end
|
|
return self:GenerateNop(0.2)
|
|
end
|
|
|
|
--重新以主角当前位置作为寻路起始位置
|
|
local scene_obj = self.scene_obj or Scene.Instance:GetMainRole()
|
|
|
|
local x1, y1 = scene_obj:GetRealPos()
|
|
local x2, y2 = target_obj:GetRealPos()
|
|
-- local distance = dir:length()
|
|
local distance = GameMath.GetDistance(x1, y1, x2, y2, false)
|
|
--print("= = = = SourceOperateTargetAction: dist:", distance, self.range)
|
|
--距离在可动作范围内
|
|
if distance <= self.range * self.range then
|
|
--在这停止移动
|
|
if scene_obj:GetType() == SceneBaseType.MainRole then
|
|
local real_pos = co.Vector2(scene_obj:GetRealPos())
|
|
if scene_obj.move_flag == MOVE_TYPE.ACCELERATE then
|
|
EventSystem.Fire(GlobalEventSystem, SceneEventType.MOVEREQUEST, real_pos.x, real_pos.y, MOVE_TYPE.ACCELERATE)
|
|
else
|
|
EventSystem.Fire(GlobalEventSystem, SceneEventType.MOVEREQUEST, real_pos.x, real_pos.y, MOVE_TYPE.NORMOL_MOVE)
|
|
end
|
|
end
|
|
local dir = co.TempVector2(x2-x1, y2-y1)
|
|
|
|
scene_obj:SetDirection(dir)
|
|
|
|
scene_obj:WaitForNextMove()
|
|
|
|
-- 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))
|
|
if self.action_func then
|
|
self.action_func() --执行相关动作
|
|
end
|
|
self.last_action_time = Status.NowTime
|
|
now_oper = self:GenerateNop(0.2)
|
|
self.is_finish = true
|
|
dir:DeleteV()
|
|
else
|
|
--当前的起始坐标和终点坐标,必须用RealPos计算才能准确
|
|
local start_logic_pos = co.Vector2(scene_obj:GetLogicPos())
|
|
local end_logic_pos = co.Vector2(target_obj:GetLogicPos())
|
|
|
|
--范围外,执行寻路
|
|
-- if not self.is_path_valid or self.now_use_pair > self.total_pair then
|
|
--重新计算路径
|
|
self.path_list = {}
|
|
-- print("= = = = 重新寻路")
|
|
if not self:RecalcPathInfo(start_logic_pos, end_logic_pos, 0) then
|
|
self.is_finish = true
|
|
print("计算路径失败直接停止该操作包")
|
|
return self:GenerateNop(0.2) --计算路径失败直接停止该操作包(怪卡障碍点或者自己卡障碍点)
|
|
end
|
|
-- end
|
|
|
|
--取出下一个小路径执行
|
|
local move_pair = self.path_list[self.now_use_pair]
|
|
if move_pair == nil then
|
|
self.is_finish = true
|
|
return self:GenerateNop(0.2)
|
|
end
|
|
|
|
-- 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))
|
|
now_oper = NowOperateTargetMove.New(now_time, move_pair.start_point, move_pair.end_point, target_obj, self.range,scene_obj)
|
|
self.now_use_pair = self.now_use_pair + 1
|
|
end
|
|
return now_oper
|
|
end
|