源战役客户端
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 

166 行
5.2 KiB

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