cocos2dx3.17的csb文件使用方法

一、手写代码加载csb文件,并获取控件

    --加载csb场景文件,并将场景添加到节点中。local node = cc.CSLoader:createNode("MenuScene.csb")self:addChild(node)--获取场景中的根节点(场景的跟节点一般是容器)local rootLayout = node:getChildByName("Panel_2")--强制转换,目前还没搞懂为啥要强制转换,可有可无,测试不写这串代码,一样可以获取到它的子节点。-- local rootNode = tolua.cast(root, "ccui.Widget")--获取控件(按钮  复选框   图片   文本 进度条  滑动条  出入框等)local button =rootLayout:getChildByName("Button_2")--给控件添加事件(不同控件,他的事件类型不同,使用的方法也就不同,),下面是给按钮添加点击事件button:addClickEventListener(function(sender,eventType) print("点击了开始按钮")end)    
  • 控件的通用事件

    一般想封装控件的通用事件的话,可以通过addTouchEventListener(sender,eventType)来添加事件,下面示例:

--[[btn 控件本身对象ended 事件类型(放开)对应的回调函数began 事件类型(按下)对应的回调函数moved 事件类型(移动)对应的回调函数canceled 事件类型(取消)对应的回调函数
]]
function cc.exports.setButtonFunction(btn, ended, began, moved, canceled)btn:addTouchEventListener(function(sender, eventType)if eventType == ccui.TouchEventType.began thenif began then began(sender) endelseif eventType == ccui.TouchEventType.ended thenif ended then ended(sender) endelseif eventType == ccui.TouchEventType.moved thenif moved then moved(sender) endelseif eventType == ccui.TouchEventType.canceled thenif canceled then canceled(sender) endendend)
end

二、通过mvc ViewBase加载csb文件

ViewBase是系统给我们封装好了的一个类,该类主要作用是加载界面相关的操作。如果我们想使用这种方式获取控件实例或者给控件添加事件的话,则需要修改ViewBase类的ViewBase:createResourceBinding(binding)f方法,因为他原生目前不支持控件根节点是容器,而我们一般会用容器包裹控件,所以如果使用RESOURCE_BINDING,并且你的控件根节点是容器的话,则需要手动修改该方法。在第三标题我们会讲怎么修改。使用示例如下:

local MainScene = class("MainScene",cc.load("mvc").ViewBase)MainScene.RESOURCE_FILENAME="MenuScene.csb"MainScene.RESOURCE_BINDING = {["Button_2"]   = {["varname"] = "bn_StartGame",  ["events"] = { {event = "touch" ,  method ="onBack"   }}  }} funcation MainScene:ctor()self.bn_StartGame:addClickEventListener(function(sender,eventType)print("点击了开始按钮")end)endfuncation MainScene:onBack()print("触摸了")endreturn MainScene

1、MainScene.RESOURCE_FILENAME=”MenuScene.csb”

这个变量是设置场景的csb文件名称,读取时在ViewBase类中读取的
下面会讲一下ViewBase类怎么读取的。

2、MainScene.RESOURCE_FILENAME

这个变量是设置绑定控件,获取控件的实例

    MainScene.RESOURCE_BINDING = {["Button_2"]   = {["varname"] = "bn_StartGame",  ["events"] = { {event = "touch" ,  method ="onBack"   }}  }} 

使用方式模板(两种方式):

MainScene.RESOURCE_BINDING =
{--不添加事件["cocos控件名"] = {["varname"] = "引用变量名" } --添加事件["cocos控件名"] = {["varname"] = "引用变量名",["events"]={{["event"]="事件类型(原生现在支持一种)",["method"]="回调函数"},...}}
}

三、ViewBase类源码讲解

  • 源码示例:

local ViewBase = class("ViewBase", cc.Node)function ViewBase:ctor(app, name)self:enableNodeEvents()self.app_ = appself.name_ = name-- 检查子类中是否设置RESOURCE_FILENAME属性,并得到他的value值local res = rawget(self.class, "RESOURCE_FILENAME")if res then--加载csb文件self:createResourceNode(res)end--检查子类中是否设置RESOURCE_BINDING属性,并得到他的value值local binding = rawget(self.class, "RESOURCE_BINDING")if res and binding then--获取控件的实例self:createResourceBinding(binding)end--判断子类有没有重写onCreate方法,有,调用子类的onCreate方法if self.onCreate then self:onCreate() end
endfunction ViewBase:getApp()return self.app_
endfunction ViewBase:getName()return self.name_
endfunction ViewBase:getResourceNode()return self.resourceNode_
end
--[[*加载csb文件的方法*resourceFilename 文件名称(带后缀名)
]]
function ViewBase:createResourceNode(resourceFilename)--判断是否已经加载过csb文件if self.resourceNode_ then--移除自己self.resourceNode_:removeSelf()--设置为nilself.resourceNode_ = nilend--通过CSLoader加载csb文件,得到一个节点self.resourceNode_ = cc.CSLoader:createNode(resourceFilename)assert(self.resourceNode_, string.format("ViewBase:createResourceNode() - load resouce node from file \"%s\" failed", resourceFilename))--将节点添加到该父节点(场景,层)中self:addChild(self.resourceNode_)
end
--[[*绑定控件*binding 在ViewBase子类中设置的RESOURCE_BINDING(规则模板(表))
]]
function ViewBase:createResourceBinding(binding)assert(self.resourceNode_, "ViewBase:createResourceBinding() - not load resource node")--遍历规则表for nodeName, nodeBinding in pairs(binding) do--节点通过名称直接获取子控件实例--这里就是我上面说的问题所在了,这里是直接通过根节点获取控件,往往,根节点的子节点是容器,而不是控件,所以这里会得不到控件local node = self.resourceNode_:getChildByName(nodeName)--如果设置变量名不为nilif nodeBinding.varname then--则将node赋值类nodeBinding.varname变量self[nodeBinding.varname] = nodeend--遍历规则表中的事件--nodeBinding.events or {}这个表达式相当于三目运算 nodeBinding.events~=nil?nodeBinding.events:{}for _, event in ipairs(nodeBinding.events or {}) do--原生这里只支持touch事件,如果有别的需求可自行添加if event.event == "touch" then--给控件设置onTouch事件并设置回调函数。node:onTouch(handler(self, self[event.method]))endendend
end
--[[*跳转场景(翻译:展示场景)*transition 衔接动画*time  衔接动画播放时间*more  动画类型
]]
function ViewBase:showWithScene(transition, time, more)self:setVisible(true)local scene = display.newScene(self.name_)scene:addChild(self)display.runScene(scene, transition, time, more)return self
endreturn ViewBase
  • 修改createResourceBinding方法,达到可以使用RESOURCE_BINDING来绑定控件事件的目的(修复原生方法不能绑定使用容器包裹的控件的问题。)
--新增一个dom树表,用于存储dom树各个节点
ViewBase.dom = {}
--[[*递归遍历整个场景树中的容器和控件,将容器和控件存入dom表中*rootNode 节点类型
]]
local function recursionChlidNOde(rootNode)local  children = rootNode:getChildren()for _,childNOde in ipairs(children or {}) dolocal name =childNOde:getName()print("name ",name)ViewBase.dom[name]=childNOderecursionChlidNOde(childNOde)endend
function ViewBase:createResourceBinding(binding)assert(self.resourceNode_, "ViewBase:createResourceBinding() - not load resource node")recursionChlidNOde(self.resourceNode_)for bindWidgetName, ruleTable in pairs(binding) dofor widgetName,node in pairs(ViewBase.dom) doprint(widgetName,tolua.type(node)) if ruleTable.varname and widgetName==bindWidgetName thenself[ruleTable.varname] = nodefor _, event in ipairs(ruleTable.events or {}) doif event.event == "touch" thennode:onTouch(handler(self, self[event.method]))endendendendend
end

cocos2dx3.17的csb文件使用方法相关推荐

  1. cocos2dx-3.17.2 ---- xcode 14.0.1 项目移植

    一.环境准备 1.coco2dx 版本:3.17.2 2.Xcode   版本:14.0.1 3.python  版本 :2.7.14 4. cocos2dx 引擎代码重写部分. 将相应的改动代码,找 ...

  2. C语言引用不同路径下的头文件的方法

    C语言学习笔记,备查: 希望在一个A.c文件中引用另一个B.c文件的方法,可以将B.c文件中的方法提取至B.h头文件,然后在B.c和A.c中分别用#include "XXX/B.h" ...

  3. 以下不是python文件读写方法的是-python 文件读写 - 刘江的python教程

    文件读写 阅读: 18142 评论:4 到目前为止,我们做的一切操作,都是在内存里进行的.如果一旦断电或发生意外,那么你的工作成果将瞬间消失.你有没有一种人生缺少了点什么的感觉?是的,我们还缺少将数据 ...

  4. python导入excel文件-python使用xlrd模块读写Excel文件的方法

    本文实例讲述了python使用xlrd模块读写Excel文件的方法.分享给大家供大家参考.具体如下: 一.安装xlrd模块 到python官网下载http://pypi.python.org/pypi ...

  5. Python从数据库读取大量数据批量写入文件的方法

    今天小编就为大家分享一篇Python从数据库读取大量数据批量写入文件的方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 使用机器学习训练数据时,如果数据量较大可能我们不能够一次性将 ...

  6. 锁住文件linux,linux新手教程之创建锁文件的方法

    linux新手教程之创建锁文件的方法 Linux提供了多种特性来实现文件锁定.其中最简单的方法就是以原子操作的方式创建锁文件,所谓"原子操作"就是在创建锁文件时,系统将不允许任何其 ...

  7. C#中常用的几种读取XML文件的方法

    XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场所都有它的身影.Xml是Internet环境中跨平台的,依赖于内 ...

  8. python返回长度值_Python 文件 truncate() 方法(截断返回截取长度)

    概述 Python 文件 truncate() 方法用于截断文件并返回截断的字节长度. 指定长度的话,就从文件的开头开始截断指定长度,其余内容删除:不指定长度的话,就从文件开头开始截断到当前位置,其余 ...

  9. Linux下文件加密方法总结

    Linux下文件加密方法总结 为了安全考虑,通常会对一些重要文件进行加密备份或加密保存,下面对linux下的文件加密方法做一简单总结: 方法一:gzexe加密 这种加密方式不是非常保险的方法,但是能够 ...

  10. Excel-VBA操作文件四大方法之三(3/4)

    三.利用FileSystemObject对象来处理文件 FileSystemObject对象模型,是微软提供的专门用来访问计算机文件系统的,具有大量的属性.方法和事件.其使用面向对象的"ob ...

最新文章

  1. es6之扩展运算符...
  2. 【学习笔记】JSON基础概念简介
  3. 达摩院 AI 进入中国科技馆,首张 AI 识别新冠 CT 成科技抗疫历史见证
  4. 2021年第十二届蓝桥杯 - 省赛 - C/C++大学B组 - I.双向排序
  5. 开发Eureka Server
  6. centos8服务器创建新用户并指定该用户只能打开某个目录文件
  7. 【转】【Linux】Linux下统计当前文件夹下的文件个数、目录个数
  8. efcore 有值才加where_lol手游怎么加好友 日服英雄联盟手游邀请好友一起玩方法[多图]...
  9. 什么是异构数据库?它和分布式数据库的联系是什么?
  10. java开发常见的问题及解决办法 - java开发中遇到的难点有哪些_java开发常见的问题及解决办法
  11. 模拟信号采样与AD转换
  12. el-calendar 日历做排班、值班、打卡.......
  13. js 时间转东八区_js:固定与东八区服务器时间保持一致并且可选时间格式
  14. AR隐形眼镜来了,一部手机的价格,正式开启人体佩戴测试
  15. 赵小楼《天道》《遥远的救世主》深度解析(86)聪明是一种思考方式,精明只有算计和小心眼,只想赚钱却又不想承担风险是典型的弱势文化
  16. 5年前,榨干程序员老公1300万资产,逼其跳楼自杀的翟欣欣如今怎样了?
  17. The Webpage might be temporarily down or it may have moved permanently to a new web address解决
  18. 轴承故障诊断分类中常用的一些数据集介绍和获取方法
  19. Python 计算思维训练——字典与字符串练习
  20. UCI 心脏病数据集Heart Disease Data Set

热门文章

  1. python draw函数_networkx draw函数的图例
  2. 解决onebot提示当前QQ版本过低,请升级到最新版在登录!
  3. 自动机器学习框架介绍与使用(flaml、h2o)
  4. 全球及中国第三方物流行业竞争格局与十四五运作模式咨询报告2022版
  5. KP26--输入成本中心的标准作业量(活动类型价格)
  6. 7-7 选民投票 (20分)(不区分大小写投票)
  7. Flixel横板游戏制作教程(六)—SoundsandMusic(音效与音乐)
  8. 【USB】USB的VID和PID
  9. iPhone之手势切换图片
  10. 非零段划分(python)