遊戲中的數據處理-掛機技能釋放優先級

遊戲中的數據處理

簡述:記錄一些項目中 遇到的有關於數據處理的問題

例一:

項目中有掛機設定,期間需根據不同情況自動釋放技能;
思路:使用權重計算技能釋放的優先級,脫離原先多層級的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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章