cocos2dx自带的CCBProxy真弱,还好提供了一个CCBReaderLoader.lua,但是也不好用,

于是修改了一下CCBReaderLoader,下面直接贴代码了。

function NewCCBuilderReaderLoad(strFilePath,proxy,owner)
if nil == proxy then
return
end --print("ccbnew")
local ccbReader = proxy:createCCBReader()
local node = ccbReader:load(strFilePath)
local rootName = "" if nil ~= owner then
--Callbacks
--print("ccb new callback")
local ownerCallbackNames = tolua.cast(ccbReader:getOwnerCallbackNames(),"CCArray")
local ownerCallbackNodes = tolua.cast(ccbReader:getOwnerCallbackNodes(),"CCArray")
local ownerCallbackControlEvents = tolua.cast(ccbReader:getOwnerCallbackControlEvents(),"CCArray")
local i =
--print("ccb 222",ownerCallbackNames:count())
for i = ,ownerCallbackNames:count() do
local callbackName = tolua.cast(ownerCallbackNames:objectAtIndex(i - ),"CCString")
local callbackNode = tolua.cast(ownerCallbackNodes:objectAtIndex(i - ),"CCNode")
--print("ccb333",callbackName)
if "function" == type(owner[callbackName]) then
local integerValue = tolua.cast(ownerCallbackControlEvents:objectAtIndex(i - ),"CCInteger")
if nil ~= integerValue then
proxy:setCallback(callbackNode, owner[callbackName], integerValue:getValue())
end
else
--print("Warning: Cannot find owner's lua function:" .. ":" .. callbackName .. " for ownerVar selector")
end end --Variables
local ownerOutletNames = tolua.cast(ccbReader:getOwnerOutletNames(),"CCArray")
local ownerOutletNodes = tolua.cast(ccbReader:getOwnerOutletNodes(),"CCArray")
for i = , ownerOutletNames:count() do
local outletName = tolua.cast(ownerOutletNames:objectAtIndex(i - ),"CCString")
local outletNode = tolua.cast(ownerOutletNodes:objectAtIndex(i - ),"CCNode")
owner[outletName:getCString()] = outletNode
end
end local nodesWithAnimationManagers = tolua.cast(ccbReader:getNodesWithAnimationManagers(),"CCArray")
local animationManagersForNodes = tolua.cast(ccbReader:getAnimationManagersForNodes(),"CCArray") --print("cccb 44444",nodesWithAnimationManagers:count())
for i = , nodesWithAnimationManagers:count() do
local innerNode = tolua.cast(nodesWithAnimationManagers:objectAtIndex(i - ),"CCNode")
local animationManager = tolua.cast(animationManagersForNodes:objectAtIndex(i - ), "CCBAnimationManager")
local documentControllerName = animationManager:getDocumentControllerName()
--print("ccb 555",documentControllerName)
if "" == documentControllerName then end
----print("ccbcall",owner.ccbCall[documentControllerName][])
if nil ~= documentControllerName then
owner.ccbCall["mAnimationManager"] = animationManager
end --Callbacks
local documentCallbackNames = tolua.cast(animationManager:getDocumentCallbackNames(),"CCArray")
local documentCallbackNodes = tolua.cast(animationManager:getDocumentCallbackNodes(),"CCArray")
local documentCallbackControlEvents = tolua.cast(animationManager:getDocumentCallbackControlEvents(),"CCArray") for i = ,documentCallbackNames:count() do
local callbackName = tolua.cast(documentCallbackNames:objectAtIndex(i - ),"CCString")
local callbackNode = tolua.cast(documentCallbackNodes:objectAtIndex(i - ),"CCNode")
if "" ~= documentControllerName then
local cbName = callbackName:getCString()
--print("ccccccb",owner)
if "function" == type(owner.ccbCall[cbName]) then
local integerValue = tolua.cast(documentCallbackControlEvents:objectAtIndex(i - ),"CCInteger")
if nil ~= integerValue then
proxy:setCallback(callbackNode, owner.ccbCall[cbName], integerValue:getValue())
end
else
print("Warning: Cannot found lua function [" .. documentControllerName .. ":" .. callbackName:getCString() .. "] for docRoot selector")
end
end
end --Variables
local documentOutletNames = tolua.cast(animationManager:getDocumentOutletNames(),"CCArray")
local documentOutletNodes = tolua.cast(animationManager:getDocumentOutletNodes(),"CCArray") for i = , documentOutletNames:count() do
local outletName = tolua.cast(documentOutletNames:objectAtIndex(i - ),"CCString")
local outletNode = tolua.cast(documentOutletNodes:objectAtIndex(i - ),"CCNode") if nil ~= documentControllerName then
owner.ccbCall[outletName:getCString()] = tolua.cast(outletNode, proxy:getNodeTypeName(outletNode))
end
end --Setup timeline callbacks
local keyframeCallbacks = animationManager:getKeyframeCallbacks() for i = , keyframeCallbacks:count() do
local callbackCombine = tolua.cast(keyframeCallbacks:objectAtIndex(i - ),"CCString"):getCString()
local beignIndex,endIndex = string.find(callbackCombine,":")
local callbackType = tonumber(string.sub(callbackCombine,,beignIndex - ))
local callbackName = string.sub(callbackCombine,endIndex + , -)
--Document callback if == callbackType and nil ~= documentControllerName then
local callfunc = CCCallFunc:create(owner.ccbCall[callbackName])
animationManager:setCallFuncForLuaCallbackNamed(callfunc, callbackCombine)
elseif == callbackType and nil ~= owner then --Owner callback
local callfunc = CCCallFunc:create(owner[callbackName])
animationManager:setCallFuncForLuaCallbackNamed(callfunc, callbackCombine)
end
end
--start animation
local autoPlaySeqId = animationManager:getAutoPlaySequenceId()
if - ~= autoPlaySeqId then
animationManager:runAnimationsForSequenceIdTweenDuration(autoPlaySeqId, )
end
end return node
end ComView=class("ComView", function ( )
--print("comview class")
return display.newNode();
end) ComView.ccbCall={}
function ComView:ctor(args) local proxy = CCBProxy:create()

   --2014.7.30 修正,如果不用元表,就会出现同名变量被覆盖的问题
    self.ccbCall={}

    setmetatable(self.ccbCall, {__index=ComView.ccbCall})
     self.ccbNode=NewCCBuilderReaderLoad(args.f,proxy,self)

if args.add== nil or args.add==true then
self:addChild(self.ccbNode)
end
end

用法如下:

local XxxView = class("XxxView", ComView)--必须继承ComView

function XxxView:ctor()

        self.ccbCall["menu"]=handler(self,self.menu_click)--配置ccb里的回调函数,必须写在self.ccbCall表里,表里的key是ccb里的名字,对应的值是类里的函数,要用handler包装一下    

    XxxView.super.ctor(self,{f="XxxView.ccbi"}) --必须在配置回调函数后在调用父类的构造函数

        --此时可以直接用self.ccbNode操作读入的ccb

        --ccb里的变量可以直接用self.ccbCall[变量名]访问,类型不需要tolua.cast

end

function XxxView:menu_click(tag,sender)

end

注意XxxView实际是一个node,ccb是它的子节点

XxxView.super.ctor(self,{f="XxxView.ccbi"}),还可以传入一个add参数,如果add为nil或true则自动把ccb节点加到XxxView中,

其它不加,方便在XxxView里控制加载ccb的时机。

注意ccb工程要按如下设置:

改ccb要设置为js的

ccb里的根节点要设置一个js controller名字随意,如果没有设置,会有nodesWithAnimationManagers相关的错误。

或者直接把整个工程设为js的,这样新建的ccb都是js的了  菜单位置“File--Project settings"

改进cocos2dx中lua读ccb的方法的更多相关文章

  1. Learning Lua Programming (4) Cocos2d-x中Lua编程(一)

    刚开始接触cocos2d-x 下的Lua编程,主要参看了李华明大神的博客中的介绍,http://blog.csdn.net/xiaominghimi/article/category/1155088  ...

  2. Cocos2d-x中获取设备语言的方法

    1.cocos2dx获取设备语言的方法:CCApplication::sharedApplication()->getCurrentLanguage() 2.cocos2dx 2.1.4支持识别 ...

  3. cocos2dx中的场景和使用方法

    1.一个游戏中有且只有一个导演,但是至少有一个场景 2.场景是游戏元素节点数的根节点,也可以理解为该场景下的渲染树的根节点 3.场景是一个容器,包含了该场景下的所有游戏元素,比如层,精灵 4.场景是导 ...

  4. cocos2dx中加载图片资源的方法,和从内存中获取已经加载的图片资源的方法

    游戏中通常需要将常用的资源如:声音,图片,plist文件,提前加载进内存,以加快游戏的流畅度 1.预加载声音: SimpleAudioEngine::getInstance()->preload ...

  5. 关于Cocos2d-x中打包图集和使用方法

    准备的过程 1.打开TextruePacker软件 2.把游戏中要使用的图片拖到TextruePacker里面,TextruePacker会自动帮我们排序,让所有小图变成一个大图 3.点击Publis ...

  6. 关于Cocos2d-x中的scheduleUpdate和update方法的使用

    一.如果要让某类实例对象要连续执行某些语句(比如让每个Block实例从运行框最右边移动到最左边) 要在Block类中增加一些东西 1.先在其.cpp文件的init()函数中执行scheduleUpda ...

  7. cocos2dx之lua派生类和方法重新

    记得把extern.lua拷贝到你的资源目录,这里要用到 require "extern" MyLayer = class("MyLayer", functio ...

  8. 关于Cocos2d-x中init方法和onEnter方法的区别

    init()和onEnter()这两个方法都是写实例化对象的类(比如继承自Node的一些类等等)的时候用到的方法. 一般都是public类型下面的 bool init(); void onEnter( ...

  9. 关于Cocos2d-x中让主角运动的方法

    比如要让角色跳起来 1.如果是用到物理引擎,那么在物理世界中,可以用 hero->getPhysicsBody()->setVelocity(Vec2(0, 400));  //给主角一个 ...

随机推荐

  1. log4j.properties 详解与配置步骤总结

    先提供一个项目中使用log4j.properties配置 #log4j.rootLogger=WARN, stdout, file log4j.rootLogger=INFO,console,dail ...

  2. (C++)虚函数表解析(转)

    (文章出处不详,转自:http://blog.csdn.net/hairetz/article/details/4137000) C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用 ...

  3. AUC(Area Under roc Curve)学习笔记

    AUC是一种用来度量分类模型好坏的一个标准. ROC分析是从医疗分析领域引入了一种新的分类模型performance评判方法. ROC的全名叫做Receiver Operating Character ...

  4. unix 网络编程 第五章

    个人对unix 网络编程中的代码进行了精简,保留了主要和关键部分. 1 tcpserve01 程序见 https://github.com/juniperdiego/Unix-network-prog ...

  5. 旧文备份:简单CANOpen 协议说明

    (十年前的旧文,不舍等扔) 创建日期:2005-11-17 修改日期:2005-11-17 文件名称:简单CANOpen 协议说明.doc 作者:winshton 版本:V1.0 (注:本文以24in ...

  6. Hadoop集群+Spark集群搭建(一篇文章就够了)

    本文档环境基于ubuntu16.04版本,(转发请注明出处:http://www.cnblogs.com/zhangyongli2011/ 如发现有错,请留言,谢谢) 一.准备 1.1 软件版本 Ub ...

  7. 恢复阿里云RDS云数据库MySQL的备份文件到自建数据库

    云数据库MySQL版使用开源软件Percona Xtrabackup对数据库进行备份,所以您可以使用该软件将云数据库MySQL的备份文件恢复到自建数据库中,本文将介绍详细的操作步骤. 关于云数据库My ...

  8. 破解Aspose 操作pdf word等文档 对10以下版本有效

    using System; using System.IO; namespace LicenseHelper { public static class License { public const ...

  9. 架构(三层架构)、框架(MVC)、设计模式三者异同点

    前言: 本博客主要针对架构.框架和设计模式三者的区别.还有三层和MVC的区别进行讨论.对于这三者一点都不了解的.请点在维基和百度百科上补补课.这里就不发链接了 软件架构(software archit ...

  10. [Unity3D]Unity+Android交互教程——让手机"动"起来

    想要用Unity实现一个二维码扫描的功能,然后网上找插件,找到一个貌似叫EasyCodeScanner,但下载下来用用.真不好使,一导入执行就报错.调好错了再执行发现点button没反应.重复试了几遍 ...