高效、穩定開發功能的一些心得

在開始編碼前必定要足夠了解案子,瞭解各類特殊狀況,和美術、策劃、服務器溝通好,最後寫好僞代碼。html

一些建議服務器

1.儘可能複用,例如重複的對象單獨抽出來作成item,別的模塊也用到的作成通用item,不要寫重複代碼。性能

2.作功能前先考慮別人會不會用到,用到多是什麼狀況,也能夠詢問策劃,例以下面這個界面有7個業務用到,每一個業務的需求都不太同樣。作的時候能夠先考慮進去。否則後面大機率仍是在你的界面作修改,還得反工。ui

3.能配置的儘可能走配置,特別是一些細微的差異,這個很重要。就好比上面的界面能夠這麼配置編碼

DungeonsDefine.BattleType = enum
{
    ARMY_DETAIL       = 1, -- 軍團詳情
    SLG               = 2, -- 出征軍團
    FORMATION       = 3, -- slg校場編隊

    GUARD_WALL      = 4, -- 守城
    RPG_MONSTER       = 5, -- RPG戰鬥魔物

    RPG_DUNGEONS       = 6, -- RPG戰鬥,副本
    RPG_ARENA       = 7, -- RPG戰鬥競技場
    ARMY_MONSTER_DETAIL       = 8, -- 獵魔軍團詳情
}

local BattleType = DungeonsDefine.BattleType
--isRpg:是不是rpg類型,  rpg:顯示英雄技能、英雄類型  slg:顯示英雄軍團技能,帶兵量
--isShowAdd:格子爲空時是否顯示加號, true:顯示
--isSizerState:是否篩選英雄狀態, true:正常狀態排在前,出征英雄排在後
--canSelectOutManor:是否能夠選擇再也不城內英雄 true:能夠(isSizerState 爲true時纔有用到)
--isShowState:HeroFormationItem是否顯示英雄狀態圖標  true:顯示
--isNotFullTips:自定義英雄結束時,出戰英雄未盡是否須要提示, true:提示 您還能夠選擇更多英雄,肯定要繼續嗎
--autoClose:點肯定自動關閉界面,默認關閉

--title:界面標題,默認 自定義英雄
--btnTxt按鈕文本,默認 肯定
--showHelp  是否顯示幫助按鈕
DungeonsDefine.BattleConfig = enum
{
    [BattleType.ARMY_DETAIL]     = {isRpg = false, isShowAdd = false, isSizerState = false, canSelectOutManor = true,
                                   isShowState = false, isNotFullTips = false, autoClose = true},
    [BattleType.ARMY_MONSTER_DETAIL]     = {isRpg = true, isShowAdd = false, isSizerState = false, canSelectOutManor = true,
                                           isShowState = false, isNotFullTips = false, autoClose = true},
    [BattleType.SLG]             = {isRpg = false, isShowAdd = true, isSizerState = true, canSelectOutManor = false,
                                   isShowState = true, isNotFullTips = false, autoClose = true},
    [BattleType.FORMATION]         = {isRpg = false, isShowAdd = true, isSizerState = true, canSelectOutManor = true,
                                     isShowState = false, isNotFullTips = false, autoClose = true},

    [BattleType.GUARD_WALL]       = {isRpg = false, isShowAdd = true, isSizerState = true, canSelectOutManor = true,
                                  isShowState = true, isNotFullTips = false, autoClose = true, title = "des_360", btnTxt = "des_618", showHelp = true},
    [BattleType.RPG_MONSTER]       = {isRpg = true, isShowAdd = true, isSizerState = true, canSelectOutManor = false,
                                   isShowState = true, isNotFullTips = true, autoClose = true},

    [BattleType.RPG_DUNGEONS]     = {isRpg = true, isShowAdd = true, isSizerState = true, canSelectOutManor = false,
                                    isShowState = true, isNotFullTips = true, autoClose = false},
    [BattleType.RPG_ARENA]         = {isRpg = true, isShowAdd = true, isSizerState = false, canSelectOutManor = true,
                                     isShowState = false, isNotFullTips = true, autoClose = false},
}

4.每一個功能儘可能拆分紅一小塊(每一個小塊邏輯在30行之內),定位bug比較方便,策劃改案子也比較方便實現,只須要改對應的小塊就行了。spa

 

詳細步驟3d

1.需求案:儘可能對比競品,詳細的看3-4遍。code

1-1.須要知道這個功能包括哪些界面。orm

1-2.策劃案是否有遺漏(考慮多種狀況,例若有道具怎麼展現,沒有道具怎麼展現)。htm

1-3.比對競品,詢問策劃和競品不一致的地方。

1-4.若是有多語言,提早配置,方便拼界面時直接使用。

2.美術示意圖:

2-1.關注多語言是否超框,通常英語比較長。

2-2.比對案子,是否和案子一致,不一致要及時跟策劃溝通。是否有一些狀況遺漏了。例如鍛造時顯示進度條,不鍛造時顯示文本。

2-3.記錄須要用到的數據(服務端、配置讀取)

2-4.記錄全部的界面按鈕,知道按鈕的反應事件(請求服務器、打開界面、修改界面邏輯如選中狀態、調用其餘模塊如設置),額外關注須要請求服務端的按鈕,第四步定協議用得上。

3.比對服務端協議。例如

3-1.初始化須要數據,例如主界面的小紅點。

3-2.須要同步的數據,例如平叛會致使英雄狀態、經驗值、等級變化,那麼都須要同步給英雄模塊。

3-3.請求類,基本都是按鈕觸發,關注請求須要的數據,服務端須要返回的數據。

4.拼界面,通過上面三步,基本案子就很清楚了。

4-1.拆分界面,儘可能拆分的細一點,儘可能把重複的對象拆分紅一個item,例如AcquiredHeroItem。劃分後大概是下面這個樣子的。拆分規則爲:子界面>子item>方法。

按方法劃分是指:每一個方法負責一部分界面邏輯(例如替換該部分的圖片、文本,設置顯示隱藏等等)

4-2.界面適配,主要關注寬高比2:1的,4:3的,示意圖的比例三種。

4-2.關注多語言,儘可能拉長、拉高文本框,由於英語和阿語都比中文長不少。

導圖大概是這樣子的:

 5.寫數據類(邏輯類)

5-1.接受並保存服務端下發的數據,對外提供獲取數據接口,例如

-- 獲取已得到英雄
-- containRecruit 是否包含可招募英雄
-- 是否要排序
function HeroCtrl:GetAcquiredHero(containRecruit, sort)
    local heros = {}

    if containRecruit then
        for k,v in pairs(self._recruitData) do
            table.insert(heros, v)
        end
    end

    for k,v in pairs(self._heroData) do
        table.insert(heros, v)
    end

    if sort then
        table.sort(heros, HeroCtrl.SortHeroList)
    end

    return heros
end

5-2.收到服務端數據後更新本地數據,分發相對應的事件通知業務更新界面(消息系統參考:http://www.javashuo.com/article/p-xfmkvzdo-e.html

5-3.請求服務端的接口,例如

--請求穿戴戰利品
function HeroCtrl:ReqDressBootyo(sort, pos)
    local data = {sort = sort, slotid = pos}
    NetMsg.SendMsg("reqherodressbooty", data)
end

5-4.儘可能將相同類型數據單獨分裝數據類,由該模塊的ctrl維護。例如每一個英雄生成一個HeroData的數據類,該類對外提供全部業務須要的接口,例如獲取服務端數據和配置數據的接口。

5-5.邏輯計算儘可能放在數據類裏,例如是否顯示小紅點,計算都在HeroData,業務只要經過返回值設置小紅點的顯示、隱藏就行了。

--計算小紅點
function HeroData:ComputeHint()
    if self.own == HeroOwnState.RECRUIT then
        return true
    end

    local heroCtrl = PlayerTop:GetModule("HeroCtrl")
    if self:CanUpRank() and not heroCtrl:IsUpRank(self:GetHeroSort()) then
        return true
    end

    if self:CanUpQuality() and not heroCtrl:IsUpQuality(self:GetHeroSort()) then
        return true
    end

    for i=1,#self.equip do
        local state = self.equip[i].state
        if state == EquipState.CAN_DRESS or state == EquipState.COMPOSE then
            return true
        end
    end

    return false
end

6.實現界面邏輯

這步就只是單純的填界面了,須要的數據,數據類的獲取接口都寫好了。只要調用數據類獲取數據(文本內容、圖片名字、顯示和隱藏),再把獲取的數據設置給對象就行了。

 

 最後,審案子、ui示意圖必定要仔細再仔細,覺得這個涉及到你後面的定服務端協議、界面拼接。邏輯理清楚了,拆分夠小塊了(也不能過小塊了,方法調用也是要消耗性能的,大概一塊的邏輯在10-30行左右),你的程序就不容易出邏輯bug,很更好維護、修改。

相關文章
相關標籤/搜索