基于cocos2d -x的一个强大的 界面对象的基类

 ---@type uinode ui 对象的抽象
--@usage
-- 界面打开的执行流程
-- 带*的是可选重写的函数,不带*的为必须实现的
-- [定义一个对象]
-- test = {}
-- --------------------------------------------
-- ---配置函数
-- [返回CCBI的名字]
-- function test:getBindUINodeStr() end
-- [*显示模式,不实现是直接打开。不会居中]
-- function test:getShowModel() end
-- --------------------------------------------
-- ---流程函数
-- [*打开界面前要执行网络操作]
-- function test:getCmdStr() end
-- [*打开界面前要执行网络操作需要的数据]
-- function test:getCmdData() end
-- 网络命令成功后会进行的操作
-- function test:onRemoteAck(networkArgs) end
-- [*初始化界面上的相关信息]
-- function test:on_initUI(node,openArgs,networkArgs) end
-- [*关闭界面前要进行网络通信]
-- function test:before_close(ackfun) end
-- -----------------------------------------------------------------
-- PS:当有*函数的出现,只要*函数执行成功,才会调用之后的函数
--
-- usage: local obj = test.getInstance()
-- obj:open(args) --args 为要传送到on_initUI中的args数据
uinode ={} require("base")
require("userGuidelines") ---===============================================================
---IUiNode interface
IUiNode = {}
---IUiNode interface
createInterface(IUiNode,"IUiNode",function(self,openArgs) end)
---=============================================================== ---@field 是否为中心显示
uinode.isShowInCenterFlg = false
---@field 当前绑定的节点
--@return #cc.Node cc.node节点
uinode.node = nil
uinode ,supper= inheritance(uinode,object) ------------------------------------------------------------------------
--显示模式定义
uinode.showModel = {
NOTADDTO_CONTENT = -,
NONE = ,
NORMAL = ,
CENTER=,
DELAYED_SHUTDOWN=,
nil
} ----------------------------------------------------------
---资源管理器
local unloadResource = {} function uinode:unloadCustomResources()
local res = self:__getCustomResources()
if res ~= nil and #res > then
xse.base.unloadTextures(res)
end
end function uinode:__getCustomResources()
if self.getCustomResources == nil then return {} end
local resources = self:getCustomResources()
return resources or {}
end function uinode:starLoadResource()
if self.mask == nil then
self.mask = xse.base.loadCCBI("waitting.ccbi",false)
xse.base.Scene:addChild(self.mask,)
end
end function uinode:endLoadResource()
xse.base.Scene:removeChild(self.mask)
self.mask = nil
end ---加载资源
function uinode:loadResource(onloadComplate)
if uinode.__getCustomResources ~= nil then
local res = self:__getCustomResources()
if res == nil or #res == then onloadComplate()
else
local __id = nil
local __index =
local __timerCounter =
self:starLoadResource()
local loaded = false
__id = xse.base.timer.tick.add(function()
if loaded ~= true then loaded = true
for var=, #res do
cc.Director:getInstance():getTextureCache():addImageAsync(res[var],
function()
log("set load command :"..res[var])
__index = __index +
end)
end
end __timerCounter = __timerCounter +
if __index >= #res and __timerCounter > then
onloadComplate()
self:endLoadResource()
xse.base.timer.tick.remove(__id)
end
end)
end
elseif onloadComplate~= nil then
onloadComplate()
end
end -------------------------------------------------------------------------
--帮助函数私有成员函数 ---加载CCBI文件
--@param nodestr string 要加载的资源名字,不包含后缀名
--@return #cc.Node 一个node节点
function uinode:loadCCBI(nodestr)
assert(nodestr~=nil and type(nodestr)=="string","param nodestr must a string type")
-- local node = xse.base.loadScene(nodestr,nil,self:getShowModel()== uinode.showModel.CENTER)
local node = xse.base.loadScene(nodestr,nil)
return node
end ---为当前对象绑定一个ccbi
--@param nodestr string 要加载的资源名字,不包含后缀名
--@return cc.Node 当前对象绑定的节点
function uinode:bindCCBI(nodestr)
if self.node~=nil then
local parent = self.node:getParent()
if parent then parent:removeChild(parent) end
self.node = nil
end if self.node == nil then
self:registeUICallBack()
self.node = self:loadCCBI(nodestr)
self.node.__bindToInstance = self
end
return self.node
end ---绑定脚本到ccbi上
function uinode:bindScriptToNode(node)
node.__bindToInstance = self
end ---卸载ccbi文件
--@param nodestr string 要卸载的资源名字,不包含后缀名
function uinode:unloadCCBI(nodestr)
assert("false","暂时不支持的方法")
end ---重新加载CCBI文件
--@param nodestr string 要加载的资源名字,不包含后缀名
function uinode:reloadCCBI()
local parent = self.node:getParent()
if parent ~= nil then parent:removeChild(self.node)end
self:bindCCBI(self:getBindUINodeStr())
end ---显示界面函数
function uinode:show(onshowComplate)
assert(onshowComplate,"callbakc is nil value")
switch(self:getShowModel(),{ [uinode.showModel.NOTADDTO_CONTENT] = function()
---不设置为添加到窗口中,就直接调用aftershow
self:afterShow()
end, [uinode.showModel.NORMAL] = function()
---添加到界面上
xse.base.show(nil,self.node)
---显示动画
xse.base.animal.show(
self.node,
nil,
function() onshowComplate() ; self:afterShow() end
)
end, [uinode.showModel.CENTER] = function()
onshowComplate();
xse.base.animal.showOnCenter(self.node,nil,
function() self:close(); end,
self,
function ()
self:afterShow();
end)
end, [uinode.showModel.DELAYED_SHUTDOWN] = function()
onshowComplate();
xse.base.show(nil,self.node);
end, [uinode.showModel.NONE] = function()
xse.base.animal.show(self.node,xse.base.Scene,
function()
onshowComplate();
self:afterShow();
end, false
) end, ["default"] = function()
xse.base.animal.show(self.node,
nil,
function() onshowComplate();self:afterShow() end)
end,
}) self:endLoadResource()
end function uinode:afterShow() end function uinode:processClose()
self.moreNode = nil
switch(self:getShowModel(),{
[uinode.showModel.NORMAL] = function()
xse.base.hide(nil,self.node,function()
self:after_close()
end);
self.node = nil;
end,
[uinode.showModel.CENTER] = function()
xse.base.hide(nil,self.node,function()
self:after_close()
end);
self.node = nil;
end,
[uinode.showModel.DELAYED_SHUTDOWN] = function()
local action = cc.Sequence:create(cc.DelayTime:create(),cc.CallFunc:create(function()
xse.base.hide(nil,self.node,function() self:after_close() end);
self.node = nil;
end))
self.node:runAction(action)
end,
["default"] = function()
xse.base.hide(nil,self.node,function()
self:after_close()
end);
self.node = nil;
end,
}) end function uinode:after_close()
self:unloadCustomResources()
end ---关闭界面函数
function uinode:close(sender)
log("#close ".. tostring(self:getHashCode()))
---在关闭前的回掉
if self.before_close ~=nil and type(self.before_close) == "function" then
self:before_close(function(rd,sn,sd)
if type(sender) == "function" then sender()end
end)
self:processClose()
else
if type(sender) == "function" then sender() end
self:processClose()
end
self:unregisteUICallBack() --避免在关闭的时候还有操作造成无法处理的bug
end ---注册自己定义的ui回调事件
function uinode:setCustomUiCallBack()
---不做任何事情,留给子类去处理
end ---注册当前node 的回调事件
function uinode:registeUICallBack()
---自定义事件注册
self:setCustomUiCallBack()
---
local name = self:getName()
if name ~="unkonw" then
for key, var in pairs(self) do
if type(var)== "function"then
xse.base.addEventSupportA(name,key,
function(sender)
assert(sender~=nil,"sender is nil value")
local __callinstance = nil
local tempsender = sender
local obj = sender
while sender ~= nil and (type(sender)== "table" or type(sender)== "userdata") do
assert(not (__callinstance and sender.__bindToInstance),"子节点界面不应该单独绑定到uinode上")
if sender.__bindToInstance~= nil then
__callinstance = sender.__bindToInstance
break;
end
sender = sender:getParent()
end if __callinstance~=nil then
local fun = __callinstance[key]
fun(__callinstance,tempsender)
return
end assert(false,"Have not found the bound script logic in all parent nodes,")
end)
end
end
end
end ---注册当前node ui 的回调事件
function uinode:unregisteUICallBack()
local name = self:getName()
if name ~="unkonw" then
for key, var in pairs(self) do
if type(var)== "function"then
---取消事件注册
xse.base.addEventSupportA(name,key,nil)
end
end
end
end ---------------------------------------------------------------------------
--业务接口 ---禁止重写这个函数®
function uinode:open(openArgs)
if self.UserGuidelineSupportConfig then
self.userGuideLineConfigKey = xse.base.random()
userGuidelineManager:addUserGuidelineSupportA(self,self.userGuideLineConfigKey)
end self:loadResource(function()
local ccbstr = self:getBindUINodeStr()
assert(ccbstr,"self:getBindUINodeStr()返回的数据不合法")
self:bindCCBI(ccbstr)---绑定界面 local function init(self)
self.__openArgs = openArgs
---发送网络命令
if self.getCmdStr and type(self.getCmdStr) == "function" then
local cmdstr = self:getCmdStr()
local dt = self:getCmdData()
---发送网络通信
local remoteTask,protocal,command = require "remoteTask",require "protocal",require "command"
assert(cmdstr,"Rewrite getCmdStr function, but the data returned is empty.")
protocal:adddt(command[cmdstr],dt)
local sn = remoteTask.add(protocal,communication.type.tcp,function(rd,sn,sd,self)
if self.onRemoteAck then self:onRemoteAck(rd) end
self:show(function()
self:on_initUI(self.node,self.__openArgs,rd)
end)
end,nil,self) else
self:on_initUI(self.node,self.__openArgs,rd)
self:show(function()
--self:on_iniself:on_initUI(self.node,self.__openArgs,rd)tUI(self.node,self.__openArgs,rd)
end)
end
end ---DEBUG模式下调用初始化一些必要的基础数据
debugCallFun(function()
require("tcpExt")
---刷新全部依赖的数据
tcpTaskQueue({
{cmd = "WORLD_INIT",dt = {},callback = function(rd,sn,sd) init(self) end,errfun = nil},
{cmd = "COMPANY_INIT",dt = {},callback = function(rd,sn,sd) end,errfun = nil},
})
end,nil) releaseCallFun(init,self)
end)
end ---绑定界面函数 [可重写]
-- @return #string 要绑定的界面,不包含后缀名
function uinode:getBindUINodeStr()
assert(false,"必须实现要绑定的界面")
return nil
end ---显示模式 [可选函数]
--@return #uinode.showModel 现实的模式
--PS:[显示模式,不实现是直接打开。不会居中]
function uinode:getShowModel()
return uinode.showModel.NORMAL
end ---打开界面前要执行网络操作[可选函数]
--@return cmdstr string
--function uinode:getCmdStr()
-- return nil
--end
--uinode.getCmdStr = nil ---发送网络命令需要的数据
--@return table #table,加载界面前发送网络命令时需要的数据
function uinode:getCmdData()
return {}
end -- ---初始化界面上的相关信息[可选函数]
--@param node cc.Node 界面已绑定好的节点
--@param openArgs unknow open方法穿过来的数据
--@param networkArgs unknow 没有使用网络函数为nil,使用了网络函数:就为网络返回的数据
--@return nil
function uinode:on_initUI(node,openArgs,networkArgs)
-- self:on_initUI(node, opendArgs, networkArgs);
end ---关闭界面前要进行网络通信 [可选函数]
--@param networkACKCallBack function(rd,sn,sd) 网络成功后的回掉函数
--@return nil
function uinode:before_close(networkACKCallBack)
return false
end uinode.before_close = nil return uinode

使用DEMO

local story = {}

require("depend")
require("tableViewExt")
require("uinode")
local tabView = require "TabView"
local text = require("richtext") inheritanceA(story,object,"object")
inheritanceA(story,uinode,"uinode")
--uinode abstract function
implementInterface(story,"getShowModel",function(self) return uinode.showModel.NONE end )
implementInterface(story,"getBindUINodeStr",function(self) return "start01" end )
implementInterface(story,"getName",function(self) return "message_layer" end )
implementInterface(story,"on_initUI",function(self,node,openArgs,networkArgs) self:init(node,openArgs,networkArgs) end ) function story:init()
cc.SimpleAudioEngine:getInstance():stopMusic()
cc.SimpleAudioEngine:getInstance():playMusic("storyBackgroudn.mp3",true) local daytime = cc.DelayTime:create()
--TODO::增加语言
self.fontConfig = {{fontSize = ,str="23世界末,第三次世界大战\"能源战\"爆发。\"联军\"为了维持庞大的军费开支,开始将阿波罗-188号飞船用于商用。一些富商为了躲避战火纷纷变卖资产换取船票前往“开普勒”,而您,曾经闻名于世的一代商业传奇人物,也随着这波人流,开启了一段新的征程。",color = xse.color.GREEN}}
local funAction = cc.CallFunc:create(function()
self.text = richtext.playMessage(self,self.node, self.fontConfig,function()
local daytime2 = cc.DelayTime:create()
local nextaction = cc.CallFunc:create(function()
xse.base.setCCBottonOnClick(self.node:getChildByTag(),function() self:swithNode() end,self)
--self:swithNode()
self.node:getChildByTag():setVisible(true)
end)
self.node:runAction(cc.Sequence:create(daytime2,nextaction))
end)
end) self.node:runAction(cc.Sequence:create(daytime,funAction))
self.node:getChildByTag():setVisible(false)
-- self.text=richtext.playMessage(self,self.node, self.fontConfig)
-- xse.base.setCCBottonOnClick(self.node:getChildByTag(),function() self:swithNode() end,self)
end function story:swithNode()
local layer = self.node:getParent()
self.text:getParent():removeChild(self.text)
layer:removeChild(self.node)
self.node = xse.base.loadCCBI("start02.ccbi")
xse.base.show(layer,self.node) local daytime2 = cc.DelayTime:create()
local nextaction = cc.CallFunc:create(function()
local instance = require("citadel")
instance:new():open()
end)
self.node:runAction(cc.Sequence:create(daytime2,nextaction))
end return story

最新文章

  1. (iOS) __block和__weak认识
  2. Swift实战-豆瓣电台(三)获取网络数据
  3. docker设置代理
  4. 李洪强iOS开发之initWithFrame,initWithCoder和aweakFormNib
  5. C#函数式程序设计之函数、委托和Lambda表达式
  6. Python Redis 数据复制.
  7. HTML与CSS:结构与表现
  8. 动态页面技术EL
  9. 最大频率栈 Maximum Frequency Stack
  10. 怎么查看自己电脑的IP地址
  11. 类与对象 - Java学习(二)
  12. PowerDesigner设计的数据库 ORA-0092
  13. Python入门之PyCharm中目录directory与包package的区别
  14. foreach循环赋值问题
  15. git学习(7)标签管理
  16. jreble安装 in idea
  17. ubuntu apt指令分析
  18. UVaLive 5031 Graph and Queries (Treap)
  19. python并发编程之线程(创建线程,锁(死锁现象,递归锁),GIL锁)
  20. 2.12 Hivet中order by,sort by、distribute by和cluster by

热门文章

  1. Python爬虫学习笔记之抓取猫眼的排行榜
  2. 动态规划:高维DP
  3. 斯特林数(Stirling number)
  4. 关于flume的几道题
  5. [Codevs1519]过路费解题报告|最小生成树|LCA
  6. 【Mysql优化】索引碎片与维护
  7. python实战===一行代码就能搞定的事情!
  8. 安装VMware Tools的步骤和那些坑
  9. STL各个数据结构特点
  10. servletcontext.getRealPath()