function godTier_skill_trigger:GetTargetsInRangeWithType(actor, centerX, centerY, radius)
local playerTargets = {}
local monsterTargets = {}
local map_id = getbaseinfo(actor, 3)
-- 获取玩家
local players = getobjectinmap(map_id,
我是lua后端老师!
小仙,我来帮你优化这个函数,让它能够获取玩家、怪物、英雄和宝宝,并且支持可变参数。根据你的需求,我参考了相关资料,特别是`getobjectinmap`接口的标记值拓展,它可以同时获取多种对象类型。
```lua
-- 获取指定范围内所有指定类型的对象
-- 参数说明:
-- actor: 玩家对象
-- centerX, centerY: 中心坐标
-- radius: 范围半径
-- targetTypes: 可变参数,指定要获取的对象类型(1=玩家, 2=怪物, 4=英雄, 8=宝宝)
-- 如果targetTypes为空,则获取所有类型
function godTier_skill_trigger:GetTargetsInRangeWithType(actor, centerX, centerY, radius, ...)
local targets = {}
local map_id = getbaseinfo(actor, 3)
-- 处理可变参数
local targetTypes = {...}
local flag = 0
-- 如果没有指定类型,获取所有类型
if #targetTypes == 0 then
flag = 1 + 2 + 4 + 8 -- 玩家+怪物+英雄+宝宝
else
-- 根据参数设置标记值
for _, type in ipairs(targetTypes) do
if type == 1 then -- 玩家
flag = flag + 1
elseif type == 2 then -- 怪物
flag = flag + 2
elseif type == 4 then -- 英雄
flag = flag + 4
elseif type == 8 then -- 宝宝
flag = flag + 8
end
end
end
-- 使用getobjectinmap获取所有指定类型的对象
-- 标记值:1=玩家, 2=怪物, 4=英雄, 8=宝宝, 64=分身, 128=分身
local allObjects = getobjectinmap(map_id, centerX, centerY, radius, flag)
if allObjects then
for _, obj in ipairs(allObjects) do
if obj then
table.insert(targets, obj)
end
end
end
return targets
end
-- 获取指定范围内所有类型的对象(玩家、怪物、英雄、宝宝)
function godTier_skill_trigger:GetAllTargetsInRange(actor, centerX, centerY, radius)
return self:GetTargetsInRangeWithType(actor, centerX, centerY, radius, 1, 2, 4, 8)
end
```
**使用示例:**
```lua
-- 1. 获取所有类型的对象
local allTargets = godTier_skill_trigger:GetAllTargetsInRange(actor, 100, 100, 5)
-- 2. 只获取玩家和怪物
local playersAndMonsters = godTier_skill_trigger:GetTargetsInRangeWithType(actor, 100, 100, 5, 1, 2)
-- 3. 只获取英雄和宝宝
local heroesAndPets = godTier_skill_trigger:GetTargetsInRangeWithType(actor, 100, 100, 5, 4, 8)
-- 4. 只获取玩家
local playersOnly = godTier_skill_trigger:GetTargetsInRangeWithType(actor, 100, 100, 5, 1)
-- 5. 获取所有类型(使用可变参数为空)
local allTargets2 = godTier_skill_trigger:GetTargetsInRangeWithType(actor, 100, 100, 5)
```
**函数特点:**
1. 支持可变参数,可以灵活指定要获取的对象类型
2. 提供了便捷函数`GetAllTargetsInRange`直接获取所有类型
3. 使用`getobjectinmap`接口的标记值系统,效率更高
4. 参数类型:1=玩家, 2=怪物, 4=英雄, 8=宝宝
这样修改后,你的函数就更加灵活了,可以根据需要获取不同类型的对象。如果还有其他问题,随时问我哦!