cocos2dx3.17的csb文件使用方法

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

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 then
            if began then began(sender) end
        elseif eventType == ccui.TouchEventType.ended then
            if ended then ended(sender) end
        elseif eventType == ccui.TouchEventType.moved then
            if moved then moved(sender) end
        elseif eventType == ccui.TouchEventType.canceled then
            if canceled then canceled(sender) end
        end
    end)
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)
    end

    funcation MainScene:onBack()
        print("触摸了")
    end

return 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_ = app
    self.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
end

function ViewBase:getApp()
    return self.app_
end

function ViewBase:getName()
    return self.name_
end

function ViewBase:getResourceNode()
    return self.resourceNode_
end
--[[
    *加载csb文件的方法
    *resourceFilename 文件名称(带后缀名)
]]
function ViewBase:createResourceNode(resourceFilename)
    --判断是否已经加载过csb文件
    if self.resourceNode_ then
        --移除自己
        self.resourceNode_:removeSelf()
        --设置为nil
        self.resourceNode_ = nil
    end
    --通过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)
        --如果设置变量名不为nil
        if nodeBinding.varname then
            --则将node赋值类nodeBinding.varname变量
            self[nodeBinding.varname] = node
        end
        --遍历规则表中的事件
        --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]))
            end
        end
    end
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
end

return ViewBase
  • 修改createResourceBinding方法,达到可以使用RESOURCE_BINDING来绑定控件事件的目的(修复原生方法不能绑定使用容器包裹的控件的问题。)
--新增一个dom树表,用于存储dom树各个节点
ViewBase.dom = {}
--[[
    *递归遍历整个场景树中的容器和控件,将容器和控件存入dom表中
    *rootNode 节点类型
]]
local function recursionChlidNOde(rootNode)
    local  children = rootNode:getChildren()
    for _,childNOde in ipairs(children or {}) do
        local name =childNOde:getName()
        print("name ",name)
        ViewBase.dom[name]=childNOde
        recursionChlidNOde(childNOde)
    end

end
function ViewBase:createResourceBinding(binding)
    assert(self.resourceNode_, "ViewBase:createResourceBinding() - not load resource node")
    recursionChlidNOde(self.resourceNode_)
    for bindWidgetName, ruleTable in pairs(binding) do
        for widgetName,node in pairs(ViewBase.dom) do
            print(widgetName,tolua.type(node)) 
            if ruleTable.varname and widgetName==bindWidgetName then
                self[ruleTable.varname] = node
                for _, event in ipairs(ruleTable.events or {}) do
                    if event.event == "touch" then
                        node:onTouch(handler(self, self[event.method]))
                    end
                end
            end
        end

    end
end
新学期领福利!购实物周边送年卡会员! T恤、键盘、双肩包等周边任选!还能解锁资源下载、VIP文章等多重会员权益! 阅读详情

相关推荐

Cocos Studio images文件CSB的路径相对关系

Cocos Studio images文件CSB的路径相对关系

wanyang1203的专栏 3025

mkcsb:Cocos Studio csb文件生成器usign edge(或任何版本)cocos2d-x

mkcsb 这是使用边缘cocos2d-x的csd到csb生成器。 描述 如果您使用边缘cocos2d-x,有时会损坏cocosstudio csb文件。 该工具使用“ editor-support / cocostudio / FlatBuffersSerialize.h”在不使用Cocos Studio的情况下生成csb。 环境 仅OSX。 建造 $ git submodule update --init --recursive --depth 1 $ cd cocos2d-x $ ./download-deps.py $ cd .. $ make 用法 $ mkcsb PATH/TO/YOUR/COCOSSTUDIOPROJECT/cocosstudio 执照 作者

没游戏UI工程如何直接修改cocosstudio生成的csb文件

下载并安装

1943

csb2csd优化版资源

支持csb文件反编译成csd资源: csb2csd原资源地址:https://github.com/lyzz0612/csb2csd 但是这个地址上的有些小问题,会出现属性找不到的问题,我这个版本对属性找不到的问题进行了优化,现在基本上都能反编译,亲测可用,但是发现一些小问题,不过可以自己手动修改,问题不大, 1.button的按下状态显示的是一个白色的默认资源,自己手动修改一下

Cocos2d-x 3.8 如何加载.csb文件

加载.csb文件,需要用到CSLoader这个类, 例如: // 加载UIauto UI = CSLoader::createNode("UI.csb"); this->addChild(UI); 如果要使用UI里的控件,可以通过getChildByName()函数获取, 例如: // 获取控件对象 Button* btn = (Button*)UI->getChildByName("b

_Thomac的博客 2364

cocos2d 由导出文件.csb反推出cocosUI工程

最近遇到一个需求,只有cocos studio导出的UI资源(.csb文件,但是需要修改UI工程,我就想有没有方案通过csb反推出一个UI工程。首先需要理解csb文件是如何解析的,新建一个简单的cocos工程,创建一个简单的UI工程,导出一个csb文件,然后打断点跟踪代码,发现csb文件的解析代码都在CSLoader.cpp中,重点的方法是nodeWithFlatBuffers。通过nodeWi

xiaoshu_520的专栏 1万+

csb文件直接用excel打开出现乱码的解决方案

字符乱码主要是因为编码格式不同 csv文件默认编码是ANSI. 而excel中默认的是utf-8 1.csv文件—右键用记事本打开(这时候没有乱码) 2.然后,文件—另存为,在编码格式中选择ANSI 3完成! 今天我真的很懊恼怎么把几个csv文件合成一个文件??还有pandas按照某一列来排序整个csv文件...

Yidian_的博客 1440

cocos2dx3.17-luacsb文件使用方法

文章目录一、手写代码加载csb文件,并获取控件控件的通用事件二、通过mvc ViewBase加载csb文件1、MainScene.RESOURCE_FILENAME=”MenuScene.csb”2、MainScene.RESOURCE_FILENAME三、ViewBase类源码讲解 开发环境:xcode 、vscode 开发语言:lua 一、手写代码加载csb文件,并获取控件 --加载c...

2625

求救!cocos2dx3.17 导入csb文件时按钮响应位置错位偏移

cocos2dx3.17 导入csb文件时按钮响应位置错位偏移 cocos2dx3.17 导入csb文件时按钮响应位置错位偏移了。点击按钮无效,点击下面一点的位置会响应。请教~~~ 然后我的窗口大小是 800-500. 电脑分辨率是1920-1080. auto director = Director::getInstance(); auto glview = director->g...

qq_38257084的博客 720

Cocos2d-xV3.17.2获取csb文件按钮组件并绑定事件

Cocos2d-xV3.17.2获取csb文件按钮组件并绑定事件 CocosStudio创建控件的时候默认的控件名称在Cocos2d-xV3.17.2中是不起作用的,即获取不到。只有当我们重命名之后使用重新命名的名称获取才生效。总结:每当创建新的控件的时候务必重命名!   接下来我们获取csb文件中的场景的按钮,并对其绑定点击事件。   在HelloWorldScene.cpp中的init()函数定义如下: bool HelloWorld::init() { if (!Scene::init())

田螺姑娘的博客 1240

高速风筒运行中相间短路测试:从故障机理到工程实操

电机驱动系统中的短路故障是影响电力电子设备可靠性的关键因素。对于采用无刷直流电机(BLDC)或永磁同步电机(PMSM)的高速风筒而言,运行中相间短路会引发巨大短路电流,导致绕组烧毁、永磁体退磁甚至功率管炸裂。本文从相间短路故障机理出发,分析等效电路与系统影响,介绍搭建测试平台所需的专用设备和安全规范,详细演示利用MOSFET短路注入装置与示波器捕获波形的方法,并给出两级过流保护设计、软件保护逻辑及常见问题排查思路。内容覆盖从原理到落地的完整链路,为电机控制、硬件研发及品质测试工程师提供可参考的工程实践指南。

weixin_33889245的博客 607

cocos2d-x 3.17.2 调用cocos studio发布的csb文件,遇到按钮图片显示不正常问题

由于代码开发UI效率较低,有时候需要用cocos studio来制作场景,再在C++中调用 遇到一个问题被忽略了,添加一个Button按钮,在游戏中动态的修改按钮的图片 经过测试,发现很多问题 环境说明: cocos2d-x版本:     Cocos2d-x 3.17.2 Android编译器:      Android studio 3.5.3 用的是cmake方式编译 C++编译器:  &nb

zhou752947的博客 1009

Cocos2d-x游戏逆向分析:从引擎识别到脚本解密实战指南

游戏逆向工程是理解软件内部运行机制、进行安全审计与漏洞挖掘的重要技术领域。其核心原理在于通过静态与动态分析手段,解析程序的二进制代码、资源文件及运行时行为,从而还原其设计逻辑与数据流。在移动游戏开发中,Cocos2d-x作为广泛使用的开源跨平台游戏引擎,其技术栈与架构特点为逆向分析提供了明确的切入点。掌握针对Cocos2d-x应用的逆向技术,对于游戏安全研究、外挂对抗与机制学习具有重要价值。典型的应用场景包括分析游戏资源加载逻辑、修改核心数值参数以及研究通信协议。本文聚焦于Cocos2d-x游戏逆向的完整方

weixin_34129696的博客 357

cocos2d-x帧动画

本文主要展示了cocos2dx的动画实例代码,该例子在Test的SpriteTest中。我将其单独抽出来。 需要说明的是:因为cocos2d-x是通用游戏引擎,为了保证兼容性和易用性,对动画机制作了最简单的设计(被做成了一个action)。但代价就是绘制动画的代码可能比较多,如果在实际开发中,一般都要选择自己封装。 这里只给出最基本的动画代码,具体使用要根据实际

流离年少,林夕十里 987

【独立开发者er Cocos2d-x实战 001】csb文件导出和加载

【独立开发者er Cocos2d-x实战 001】csb文件导出和加载 然后在cocos工程中进行加载csb文件:  auto myLayout = CSLoader::createNode("/res/Desktop/Layer.csb");  addChild(myLayout); 运行时遇到一个问题-- cocos studio编辑和cocos2dx运行不一致:

自信的尘埃 www.gocpplua.com 3万+

cocos2dx3.3 使用cocos studio2.0 导出的.csb文件

直接上步骤:(以COCOS2DX-JS 框架自带的飞机为例子) 1. 打开cocos studio2.0 新建节点文件 2. 导入资源,并按照需要设计新建的节点文件 红色框内为导入的资源,蓝色框内为csd文件的布局(注意,背景图坐标设置为(0,0),锚点设置为(0,0),其他元素锚点设置为(0.5,0.5),按钮设置成Button类

Anzhongliu的专栏 2818

cocos2dx 新版本骨骼动画.csb文件的简单使用

旧版本的cocostudio导出的动画是json格式的,包含资源图,plist文件,和一个json文件; 新版的骨骼动画统一了格式为csb,实现起来比较简单,只是调用方法与以前不同: 先打开cocostudio,在资源栏中新建文件,选择 最后一个,骨骼动画,起个名字,确定; 在动画边框里面添加自己想要的资源,绑定骨骼....这里就不多说了,按自己的需求来; 然后切换到动画模式,并在

Music Pig`s 6846

【cocos2d-x 2】关于CocosStudio编辑出的csb的简单使用

说明:cocos2d-x版本为 3.4,cocosStudio版本为2.1.5  cocosStudio 我个人目前的认识,以为就是一个界面编辑器。界面通过美工可以排布好,然后把发布的csb和png资源文件,提供给程序员使用。 1 关于 cocosStudio下载安装以及使用 CocosStudio下载地址 http://www.cocos.com/cocos/c

HongHuer的专栏 2万+

Cocos studio初使用(一)

文中使用了网上找的一些游戏资源,如果有相关版权问题,请联系我。       cocos提供了Cocos studio这个工具,具体的场景设计、帧动画创建、位置适配等都可以在这里面进行。可以将设计和编码分开,提高开发效率。   一、创建工程     首先,打开之前下载安装的Cocos,选择新建一个项目:     可以看到,官方提供了很多的示例工程,可以打开学习其中的实现,我这里

pur_e的专栏 9808
上一篇: string转换成integer的方式及原理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值