游戏中的数据处理-挂机技能释放优先级

游戏中的数据处理

简述:记录一些项目中 遇到的有关于数据处理的问题

例一:

项目中有挂机设定,期间需根据不同情况自动释放技能;
思路:使用权重计算技能释放的优先级,脱离原先多层级的if else语句,理清的逻辑关系以数据的方式呈现。

代码实现:

----环境状态 外部对权重计算的影响
--是否需要释放群体技能
local is_need_multi = GuajiCtrl.IsMultiTarget(aim_obj_x, aim_obj_y, 1)
--获取设置中的设定好的技能id 判断当前技能是否可使用
local single_skill_idx, multi_skill_idx = SettingData.Instance:GetGuajiSkillData()      
local function is_setting_set_guaji_skill(id)       
    return id == SettingData.SKILL[prof][2][multi_skill_idx + 1] or id == SettingData.SKILL[prof][1][single_skill_idx + 1]
end
--该技能不在设置中设定 需做特殊处理
local function is_bisha(id)
    return id == 32
end

--初始化 技能优先级结构体
local function init_skill_data(t)
    --根据不同环境状态(是否需要群体攻击is_multi 是否可以使用can_use) 计算技能释放优先级
    t.calc_priority_num = function (is_multi, can_use)
        return t.damage + (is_multi and t.multi or 0) + (not can_use and t.not_can_use or 0)
    end
    return t
end

--以技能的 伤害, 范围伤害, 是否可使用 计算优先级
local priority_attr_list = {
    [1] = init_skill_data{id = 32, damage = 5, multi = 10, not_can_use = -1000},        --必杀技
    [2] = init_skill_data{id = 12, damage = 3, multi = 0, not_can_use = -1000},         --大雷电术
    [3] = init_skill_data{id = 83, damage = 4, multi = 0, not_can_use = -1000},         --火龙气焰
    [4] = init_skill_data{id = 17, damage = 1, multi = 10, not_can_use = -1000},        --流星火雨
    [5] = init_skill_data{id = 18, damage = 2, multi = 10, not_can_use = -1000}         --冰雪咆哮
}

--进行排序 筛选最佳技能
table.sort(priority_attr_list, function (a, b)
    local a_can_use = GuajiCtrl.CanAutoUseSkill(a.id) and (is_setting_set_guaji_skill(a.id) or is_bisha(a.id))
    local b_can_use = GuajiCtrl.CanAutoUseSkill(b.id) and (is_setting_set_guaji_skill(b.id) or is_bisha(b.id))
    return a.calc_priority_num(is_need_multi, a_can_use) > b.calc_priority_num(is_need_multi, b_can_use)
end)
--得到技能id
skill_id = priority_attr_list[1].id
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章