在開始編碼前一定要足夠了解案子,了解各種特殊情況,和美術、策劃、伺服器溝通好,最後寫好偽**。
一些建議
1.盡量復用,例如重複的物件單獨抽出來做成item,別的模組也用到的做成通用item,不要寫重複**。
2.做功能前先考慮別人會不會用到,用到可能是什麼情況,也可以詢問策劃,例如下面這個介面有7個業務用到,每個業務的需求都不太一樣。做的時候可以先考慮進去。不然後面大概率還是在你的介面做修改,還得反工。
3.能配置的盡量走配置,特別是一些細微的差別,這個很重要。就比如上面的介面可以這麼配置
dungeonsdefine.battletype =enum4.每個功能盡量拆分成一小塊(每個小塊邏輯在30行以內),定位bug比較方便,策劃改案子也比較方便實現,只需要改對應的小塊就好了。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_monster_detail] = ,
[battletype.slg] = ,
[battletype.formation] = ,
[battletype.guard_wall] = ,
[battletype.rpg_monster] = ,
[battletype.rpg_dungeons] = ,
[battletype.rpg_arena] = ,
}
詳細步驟
1.需求案:盡量對比競品,詳細的看3-4遍。
1-1.需要知道這個功能包括哪些介面。
1-2.策劃案是否有遺漏(考慮多種情況,例如有道具怎麼展示,沒有道具怎麼展示)。
1-3.比對競品,詢問策劃和競品不一致的地方。
1-4.如果有多語言,提前配置,方便拼介面時直接使用。
2.美術示意圖:
2-1.關注多語言是否超框,一般英語比較長。
2-2.比對案子,是否和案子一致,不一致要及時跟策劃溝通。是否有一些情況遺漏了。例如鍛造時顯示進度條,不鍛造時顯示文字。
2-3.記錄需要用到的資料(服務端、配置讀取)
3.比對服務端協議。例如
3-1.初始化需要資料,例如主介面的小紅點。
3-2.需要同步的資料,例如平叛會導致英雄狀態、經驗值、等級變化,那麼都需要同步給英雄模組。
4.拼介面,經過上面三步,基本案子就很清楚了。
4-1.拆分介面,盡量拆分的細一點,盡量把重複的物件拆分成乙個item,例如acquiredheroitem。劃分後大概是下面這個樣子的。拆分規則為:子介面》子item>方法。
4-2.介面適配,主要關注寬高比2:1的,4:3的,示意圖的比例三種。
4-2.關注多語言,盡量拉長、拉高文字框,因為英語和阿語都比中文長很多。
導圖大概是這樣子的:
5.寫資料類(邏輯類)
5-1.接受並儲存服務端下發的資料,對外提供獲取資料介面,例如
--5-2.收到服務端資料後更新本地資料,分發相對應的事件通知業務更新介面(訊息系統參考:獲取已獲得英雄
--containrecruit 是否包含可招募英雄
--是否要排序
function
heroctrl:getacquiredhero(containrecruit, sort)
local heros ={}
if containrecruit then
for k,v in
pairs(self._recruitdata) do
table.insert
(heros, v)
endend
for k,v in
pairs(self._herodata) do
table.insert
(heros, v)
endif sort then
table.sort
(heros, heroctrl.sortherolist)
endreturn
heros
end
5-3.請求服務端的介面,例如
--5-4.盡量將相同型別資料單獨分裝資料類,由該模組的ctrl維護。例如每個英雄生成乙個herodata的資料類,該類對外提供所有業務需要的介面,例如獲取服務端資料和配置資料的介面。請求穿戴戰利品
function
heroctrl:reqdressbootyo(sort, pos)
local data =
netmsg.sendmsg(
"reqherodressbooty
", data)
end
5-5.邏輯計算盡量放在資料類裡,例如是否顯示小紅點,計算都在herodata,業務只要通過返回值設定小紅點的顯示、隱藏就好了。
--6.實現介面邏輯這步就只是單純的填介面了,需要的資料,資料類的獲取介面都寫好了。只要呼叫資料類獲取資料(文字內容、名字、顯示和隱藏),再把獲取的資料設定給物件就好了。計算小紅點
function
herodata:computehint()
if self.own == heroownstate.recruit then
return
true
endlocal heroctrl = playertop:getmodule("
heroctrl")
if self:canuprank() and
not heroctrl:isuprank(self:getherosort()) then
return
true
endif self:canupquality() and
not heroctrl:isupquality(self:getherosort()) then
return
true
endfor i=1,#self.equip do
local state =self.equip[i].state
if state == equipstate.can_dress or state == equipstate.compose then
return
true
endend
return
false
end
最後,審案子、ui示意圖一定要仔細再仔細,以為這個涉及到你後面的定服務端協議、介面拼接。邏輯理清楚了,拆分夠小塊了(也不能太小塊了,方法呼叫也是要消耗效能的,大概一塊的邏輯在10-30行左右),你的程式就不容易出邏輯bug,很更好維護、修改。
對開發準則的一些心得
2018 7 4 10 08 24 星期三 有些感悟,一些東西如果設定一些準則,他可能規定了你至少要做哪些事情 你最好這樣去做 根據準則去執行,就會減少不必要的遺漏 對莫能兩可的事情快速做出決定,不再糾結 如果心裡沒有乙個標準,每次開發都會覺得這樣寫也可以那樣寫也可以,左右為難,最後感覺只要能實現當...
C 開發windows服務的一些心得
最近在做乙個windows服務的專案,發現並解決了一些問題,拿出來和大家分享一下,以下windows服務簡稱 服務 文章會在適合時間更新,因為朋友們在不斷提出新的意見或思路,感謝 1.服務如何在某種情況下彈出乙個窗體?第一種解決辦法,用安裝程式的 修改登錄檔來完成 1.右擊服務的檢視設計介面的空白處...
IOCP的一些心得
iocp的工作執行緒的個數一般設定為processors 2 2,這是綜合考慮了工作執行緒可能是等待 掛起 正在執行的狀態。如果你測試出更好的結果,以你的為標準。iocp的工作執行緒由系統排程和優化,不要去干預執行緒的排程,除非你自信能超越系統的排程。在遇到奇怪的問題時,可以嘗試減少iocp工作執行...