cocos2dx3.17的csb文件使用方法
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文件使用方法相关推荐
- 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 引擎代码重写部分. 将相应的改动代码,找 ...
- C语言引用不同路径下的头文件的方法
C语言学习笔记,备查: 希望在一个A.c文件中引用另一个B.c文件的方法,可以将B.c文件中的方法提取至B.h头文件,然后在B.c和A.c中分别用#include "XXX/B.h" ...
- 以下不是python文件读写方法的是-python 文件读写 - 刘江的python教程
文件读写 阅读: 18142 评论:4 到目前为止,我们做的一切操作,都是在内存里进行的.如果一旦断电或发生意外,那么你的工作成果将瞬间消失.你有没有一种人生缺少了点什么的感觉?是的,我们还缺少将数据 ...
- python导入excel文件-python使用xlrd模块读写Excel文件的方法
本文实例讲述了python使用xlrd模块读写Excel文件的方法.分享给大家供大家参考.具体如下: 一.安装xlrd模块 到python官网下载http://pypi.python.org/pypi ...
- Python从数据库读取大量数据批量写入文件的方法
今天小编就为大家分享一篇Python从数据库读取大量数据批量写入文件的方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 使用机器学习训练数据时,如果数据量较大可能我们不能够一次性将 ...
- 锁住文件linux,linux新手教程之创建锁文件的方法
linux新手教程之创建锁文件的方法 Linux提供了多种特性来实现文件锁定.其中最简单的方法就是以原子操作的方式创建锁文件,所谓"原子操作"就是在创建锁文件时,系统将不允许任何其 ...
- C#中常用的几种读取XML文件的方法
XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场所都有它的身影.Xml是Internet环境中跨平台的,依赖于内 ...
- python返回长度值_Python 文件 truncate() 方法(截断返回截取长度)
概述 Python 文件 truncate() 方法用于截断文件并返回截断的字节长度. 指定长度的话,就从文件的开头开始截断指定长度,其余内容删除:不指定长度的话,就从文件开头开始截断到当前位置,其余 ...
- Linux下文件加密方法总结
Linux下文件加密方法总结 为了安全考虑,通常会对一些重要文件进行加密备份或加密保存,下面对linux下的文件加密方法做一简单总结: 方法一:gzexe加密 这种加密方式不是非常保险的方法,但是能够 ...
- Excel-VBA操作文件四大方法之三(3/4)
三.利用FileSystemObject对象来处理文件 FileSystemObject对象模型,是微软提供的专门用来访问计算机文件系统的,具有大量的属性.方法和事件.其使用面向对象的"ob ...
最新文章
- es6之扩展运算符...
- 【学习笔记】JSON基础概念简介
- 达摩院 AI 进入中国科技馆,首张 AI 识别新冠 CT 成科技抗疫历史见证
- 2021年第十二届蓝桥杯 - 省赛 - C/C++大学B组 - I.双向排序
- 开发Eureka Server
- centos8服务器创建新用户并指定该用户只能打开某个目录文件
- 【转】【Linux】Linux下统计当前文件夹下的文件个数、目录个数
- efcore 有值才加where_lol手游怎么加好友 日服英雄联盟手游邀请好友一起玩方法[多图]...
- 什么是异构数据库?它和分布式数据库的联系是什么?
- java开发常见的问题及解决办法 - java开发中遇到的难点有哪些_java开发常见的问题及解决办法
- 模拟信号采样与AD转换
- el-calendar 日历做排班、值班、打卡.......
- js 时间转东八区_js:固定与东八区服务器时间保持一致并且可选时间格式
- AR隐形眼镜来了,一部手机的价格,正式开启人体佩戴测试
- 赵小楼《天道》《遥远的救世主》深度解析(86)聪明是一种思考方式,精明只有算计和小心眼,只想赚钱却又不想承担风险是典型的弱势文化
- 5年前,榨干程序员老公1300万资产,逼其跳楼自杀的翟欣欣如今怎样了?
- The Webpage might be temporarily down or it may have moved permanently to a new web address解决
- 轴承故障诊断分类中常用的一些数据集介绍和获取方法
- Python 计算思维训练——字典与字符串练习
- UCI 心脏病数据集Heart Disease Data Set