在玩遊戲的時候,尤其是手遊的時候,經常會看到那些小紅點,讓你不斷點進去,總有種逼死強迫症的感覺!從玩家的角度來說,很討厭,其實程式設計師也比較討厭的。雖然紅點就2個狀態,顯示和不顯示,但如果紅點邏輯沒寫好,對效能的影響非常大。
先簡單來說幾個原因:
1.讀表
沒法避免的要素,幾乎所有的紅點邏輯都需要讀表,這個就不說了。
2.監聽事件太多
舉個簡單的例子:**上的紅點,比如乙個商品購買最基本的必須要有錢(遊戲幣),那就需要監聽貨幣事件,有人物等級限制,需要監聽人物等級事件,有vip限制,需要監聽vip等級事件,有夠買限制,需要監聽商店事件等等。導致的結果就是有時候事件頻發的時候執行了很多遍紅點邏輯。一般的做法就是做延遲,到現在也沒遇到什麼好的解決方案。不知道有大神知道嗎?
3.子頁籤
其實一開始我認為要寫紅點邏輯一般會採用樹結構,直到我看到了神一般大**後,我服了!舉個簡單的例子:還是商店,主介面會有商店icon,商店裡有頁籤,頁籤裡有很多商品,這些全部都是分開的,比如執行一大串紅點邏輯後,顯示商店icon紅點,再執行一大串幾乎一樣的邏輯後,顯示頁籤紅點,再執行一大串幾乎一樣的邏輯後,顯示商品紅點。這個我就不太多說了。
先來幅自己畫的樹結構,不錯,符合程式美。樹結構具體什麼就不解釋了,網上一堆,看資料結構也繞不過去。只要明白葉節點決定父節點,父節點的父節點,父節點的父節點的父節點。。。是否顯示紅點就好了,這應該很清楚了。
直接上**,因為專案是lua,所以紅點也是lua寫的,易於以後熱更。
require "manager/reddotstatemgr"
local reddot = {}
reddot.__index = reddot
function reddot:new()
local new_ins = {}
setmetatable(new_ins, reddot)
new_ins.m_dotname = 0
new_ins.m_bisshow = false
new_ins.m_childdotlist = {}
return new_ins
end-- 從葉節點往根節點遞迴
function reddot:getisshowreddot()
if self.m_childdotlist == nil or next(self.m_childdotlist) == nil then
return self.m_bisshow
endlocal bisshow = false
for childdotname, childdot in pairs(self.m_childdotlist) do
if childdot:getisshowreddot() then
bisshow = true
break
endend
return bisshow
end-- 獲取紅點數量
function reddot:getreddotnum()
if self.m_childdotlist == nil or #self.m_childdotlist == 0 then
return 0
endlocal reddotnum = 0
for childdotname, childdot in pairs(self.m_childdotlist) do
if childdot:getisshowreddot() then
reddotnum = reddotnum + 1
endend
return reddotnum
end--重新整理葉節點資料
function reddot:updateleafdata(bisshow)
self.m_bisshow = bisshow
end--獲取子節點資料
function reddot:getchilddot(childdotname)
return self.m_childdotlist[childdotname]
end--新增子節點資料
function reddot:addchilddot(childdotname, childdot)
self.m_childdotlist[childdotname] = childdot
endreddotmgr = {}
reddotmgr.m_dotdatalist = {}--紅點資料
reddotmgr.m_dotuilist = {}--紅點ui
--設定紅點狀態,樹結構
--childdotname:子節點,parentdotname:根節點
--bisshow:只需要設定葉節點狀態
function reddotmgr:setreddotstate(childdotname, parentdotname, bisshow)
local childdot = self:getreddot(childdotname)
if bisshow ~= nil then
childdot:updateleafdata(bisshow)
endlocal parentdot = self:getreddot(parentdotname)
if parentdot:getchilddot(childdotname) == nil then
parentdot:addchilddot(childdotname, childdot)
endend--顯示紅點(從池裡取)
function reddotmgr:showreddotui(dotname, parenttran, pos)
if self:getreddotisshow(dotname) then
local reddotui = self:getreddotui(dotname, parenttran)
if reddotui == nil then
self:createreddotui(dotname, parenttran, pos)
endelse
self:removereddotui(dotname)
endend--刪除紅點(放回池裡)
function reddotmgr:removereddotui(dotname)
if self.m_dotuilist[dotname] ~= nil then
// 放回池裡
self.m_dotuilist[dotname] = nil
endendfunction reddotmgr:getreddotui(dotname)
return self.m_dotuilist[dotname]
endfunction reddotmgr:createreddotui(dotname, parenttran, pos)
// 動態建立紅點gamobject
// 再掛到parenttran節點下
endfunction reddotmgr:getreddot(dotname)
if dotname == nil then return end
if self.m_dotdatalist[dotname] == nil then
local tempdot = reddot:new()
self.m_dotdatalist[dotname] = tempdot
endreturn self.m_dotdatalist[dotname]
end--獲取紅點狀態:true:顯示 false:不顯示
function reddotmgr:getreddotisshow(dotname)
local dot = self:getreddot(dotname)
return dot:getisshowreddot()
end--獲取子節點紅點數量
function reddotmgr:getchildreddotnum(dotname)
local dot = self:getreddot(dotname)
return dot:getreddotnum()
end
邏輯很簡單就不解釋了,具體使用就這樣,也很簡單
function uupdatedotstate()
local isshow = false
// 一系列判斷
reddotmgr:setreddotstate(葉節點, 子節點1, isshow)
reddotmgr:setreddotstate(子節點1, 子節點2)
//。。。
reddotmgr:setreddotstate(子節點n, 根節點)
endfunction updatereddotui()
reddotmgr:showreddotui(葉節點, 葉節點transform)
reddotmgr:showreddotui(子節點1, 子節點1transform)
//。。。
reddotmgr:showreddotui(根節點, 根節點transform)
endfunction uihero:removereddotui()
reddotmgr:removereddotui(葉節點)
reddotmgr:removereddotui(子節點1)
//。。。
reddotmgr:removereddotui(根節點)
end
Laya 首日紅點邏輯
author ixenos 2019 08 26 10 50 27 1.原理 顯然,首日紅點意味著包含程序銷毀的情況,那麼就要持久化儲存資訊,這裡我們使用localstorage儲存時間點,存入時,進行時間判斷來決定是否銷毀標誌,然後在每次登陸時進行非值重新整理,時間未達到不銷毀標標誌 1 2 設定...
unity unity節點遍歷之BFS DFS
在unity的hierachy面板上,節點是以樹形結構布局的,有些時候我們需要對節點進行遍歷,通常有兩種比較常用的遍歷方式,一種是從指定節點出發 比如根節點 優先遍歷直接相鄰的子節點,即廣度優先遍歷 bfs 另一種是從指定節點出發,一路遍歷到葉子節點後再遍歷下一節點,即深度優先遍歷 dfs 遍歷節點...
UItabBar上新增紅點
系統提供的bagevalue展現形式只能為數字形式。其實小紅點展示形式的實現方式非常簡單 只需要在工程中實現如下的uitabbar分類就可以實現 直接拷貝一下 即可 在.h檔案中 import inte ce uitabbar wjbadgevalue void showbadgeonitemind...