后端Lua尊者:嗨,修仙者!我是lua后端老师!
看到你提供的代码和需求了,你希望优化`GetTargetsInRange`函数,使其能够根据`getobjectinmap`的参数(1,2,32,64,128,256)来精确获取对应类型的对象,并且当第五个参数`targetType`为`nil`或空表`{}`时,获取所有类型的对象。同时,你希望避免使用参数相加的方式,而是通过循环调用`getobjectinmap`来分别获取。
根据你的需求,我对代码进行了重构。核心思路是:
1. 当`targetType`为`nil`或空表`{}`时,遍历所有预定义的类型参数(1,2,32,64,128,256),分别调用`getobjectinmap`获取对象,并检查距离后加入结果表。
2. 当`targetType`是一个有内容的表时,遍历这个表,对其中指定的每个类型参数调用`getobjectinmap`获取对象,并检查距离后加入结果表。
3. 使用`pairs`或`ipairs`遍历`getobjectinmap`返回的table。
以下是修改后的代码:
```lua
function godTier_skill_trigger:GetTargetsInRange(actor, centerX, centerY, radius, targetType)
release_print("GetTargetsInRange", centerX, centerY, radius, targetType)
local targets = {}
local map_id = getbaseinfo(actor, 3)
-- 定义所有可获取的对象类型参数
local allTargetTypes = {1, 2, 32, 64, 128, 256}
-- 处理targetType为nil或空表{}的情况:获取所有类型
if targetType == nil or (type(targetType) == "table" and #targetType == 0) then
for _, ttype in ipairs(allTargetTypes) do
local objects = getobjectinmap(map_id, centerX, centerY, radius, ttype)
if objects then
for _, obj in pairs(objects) do
if obj then
local objX = getbaseinfo(obj, 4)
local objY = getbaseinfo(obj, 5)
local distance = math.sqrt((objX - centerX) ^ 2 + (objY - centerY) ^ 2)
if distance <= radius then
table.insert(targets, obj)
end
end
end
end
end
-- dump(targets) -- 调试用,可注释掉
return targets
end
-- 如果targetType是表且有内容,处理指定的对象类型
if type(targetType) == "table" and #targetType > 0 then
for _, ttype in ipairs(targetType) do
local objects = getobjectinmap(map_id, centerX, centerY, radius, ttype)
if objects then
for _, obj in pairs(objects) do
if obj then
local objX = getbaseinfo(obj, 4)
local objY = getbaseinfo(obj, 5)
local distance = math.sqrt((objX - centerX) ^ 2 + (objY - centerY) ^ 2)
if distance <= radius then
table.insert(targets, obj)
end
end
end
end
end
-- dump(targets) -- 调试用,可注释掉
return targets
end
-- 如果targetType不是表也不是nil,返回空表
return {}
end
```
**代码说明:**
1. **定义所有类型**:`local allTargetTypes = {1, 2, 32, 64, 128, 256}` 定义了`getobjectinmap`支持的所有对象类型参数。
2. **获取全部对象**:当`targetType`为`nil`或空表`{}`时,函数会遍历`allTargetTypes`,对每种类型调用一次`getobjectinmap`,获取该类型所有在指定地图和坐标范围内的对象,然后计算每个对象与中心点的距离,如果距离小于等于半径`radius`,则将其加入`targets`结果表。
3. **获取指定类型对象**:当`targetType`是一个有内容的表时(例如`{1, 64}`表示获取玩家和英雄),函数会遍历这个表,对表中指定的每个类型参数调用`getobjectinmap`,后续处理同上。
4. **遍历对象**:使用`pairs`遍历`getobjectinmap`返回的table,确保能处理所有返回的对象。
5. **距离检查**:对每个获取到的对象,都计算其与中心点`(centerX, centerY)`的欧几里得距离,只有距离在`radius`范围内的对象才会被加入最终结果。这比依赖`getobjectinmap`的`radius`参数更精确,因为`getobjectinmap`的`radius`参数可能指的是方形范围。
**使用示例:**
```lua
-- 获取地图3中,坐标(100,100)周围半径5格内的所有类型对象
local all = godTier_skill_trigger:GetTargetsInRange(actor, 100, 100, 5, nil)
-- 或
local all2 = godTier_skill_trigger:GetTargetsInRange(actor, 100, 100, 5, {})
-- 获取地图3中,坐标(100,100)周围半径5格内的玩家(1)和英雄(64)
local playersAndHeroes = godTier_skill_trigger:GetTargetsInRange(actor, 100, 100, 5, {1, 64})
-- 获取地图3中,坐标(100,100)周围半径5格内的怪物(2)和宝宝(256)
local monstersAndPets = godTier_skill_trigger:GetTargetsInRange(actor, 100, 100, 5, {2, 256})
```
这样修改后,函数完全按照`getobjectinmap`的参数来获取对象,避免了参数相加,并且清晰地处理了“全部获取”和“指定类型获取”两种情况。如果还有不明白的,随时问我,或者请教浮生梦尊师哦!