在開始編碼前必定要足夠了解案子,瞭解各類特殊狀況,和美術、策劃、服務器溝通好,最後寫好僞代碼。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,很更好維護、修改。