问题
举个栗子,游戏里面右上角经常有小地图,在一些场景里面需要隐藏,在其他一些场景需要显示出来。如果简单的在各个需要的地方直接设置小地图的显示隐藏,那么就会出现控制混乱的情况,如果全部控制使用条件语句之类的话又必定十分臃肿。
思路
那么我们需要做的是在小地图那边自己做好显隐接口,其它需要用到的地方就直接调用接口事件控制,为了防止混乱,事件调用时必定需要附带额外参数,这个参数(举例:1.在战斗场景中,2.在副本中,3.在剧情中,4.在隐藏主界面设置中 …)不应该是对应某某场景这么具体的,而是对应某某类型的,这样才不会太繁琐。显隐的控制值如果单独成为一个类,那么就不需要每个相同逻辑的小部件都需要复制一波代码。那么我们可以先把这个类弄出来
多状态标记类代码
--[[
多状态标记类
使用例子:
MainRightTop界面在几种情况下需要隐藏:1.在战斗场景中,2.在副本中,3.在剧情中,4.在隐藏主界面设置中 ...
那么可以在对应的类定于一个变量 self.visibleState = StateFlag.New()
进入战斗场景self.visibleState:addState(StateFlag.H1)--添加1隐藏状态
离开战斗场景self.visibleState:delState(StateFlag.H1)--移除1隐藏状态
判断界面是否显示self.isInstate()==false--显示界面(false表示没添加有任何隐藏状态)
]]
StateFlag=StateFlag or BaseClass()
-- StateFlag状态常量,当然实际使用中会使用更加易懂的变量名重新定全局变量
StateFlag.H0=0x0
StateFlag.H1=0x1
StateFlag.H2=0x2
StateFlag.H3=0x4
StateFlag.H4=0x8
StateFlag.H5=0x10
StateFlag.H6=0x20
StateFlag.H7=0x40
StateFlag.H8=0x80
StateFlag.H9=0x100
StateFlag.H10=0x200
StateFlag.H11=0x400
StateFlag.H12=0x800
StateFlag.H13=0x1000
StateFlag.H14=0x2000
StateFlag.H15=0x4000
StateFlag.H16=0x8000
--[[@
功能: 多状态标记变量
]]
function StateFlag:__init()
-- 状态值
self.value=StateFlag.H0
end
-- 设置初始值
function StateFlag:initValue(val)
self.value = val or StateFlag.H0
end
-- 添加状态量
-- 参数state:StateFlag状态常量
function StateFlag:addState(state)
self.value = bit.bor(self.value, state)
end
-- 删除状态量
-- 参数state:StateFlag状态常量
function StateFlag:delState(state)
self.value = bit.band(self.value,bit.bnot(state))
end
-- 是否有状态值
function StateFlag:isInstate()
return self.value>0
end
使用举例
local function onHideMapView(hide,mode)
if self.model.visibleState == nil then
--如果还没有就新建一个
self.model.visibleState = StateFlag.New()
end
mode = mode or StateFlag.H1
if hide then --隐藏
self.model.visibleState:addState(mode)
else --显示
self.model.visibleState:delState(mode)
end
if self.mapView then
if self.model.visibleState:isInstate() == true then
self.mapView:Hide()
else
self.mapView:CancelHide()
end
end
end
self:Bind(EventName.HIDE_Map_VIEW, onHideMapView)