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. 推荐9款使用CSS3实现的超酷动画效果

    大家都知道,在网页制作时使用CSS技术,可以有效地对页面的布局.字体.颜色.背景和其它效果实现更加精确的控制.只要对相应的代码做一些简单的修改,就可以改变同一页面的不同部分,或者页数不同的网页的外观和 ...

  2. Python Web Scraper - Simple Url Request

    from urllib.request import urlopen html = urlopen("http://www.baidu.com") print(html.read( ...

  3. SQL语法 之 基本查询

    一.语法结构 SELECT select_list [ INTO new_table ] FROM table_source [ WHERE search_condition ] [ GROUP BY ...

  4. linux性能监控命令

    vmstat 可以用来监控虚拟内存.可对操作系统的虚拟内存.IO.CPU等多个指标的整体情况进行监视. Linux系统的内存分为物理内存和虚拟内存两种.物理内存是真实的,也就是物理内存条上的内存.而虚 ...

  5. unity3d 自带截屏

    Application.CaptureScreenshot("Screenshot.png"); 截屏后的文件所在路径:Application.persistentDataPath

  6. 〖C++〗string2int把字符串转换成int的函数

    #include <stdio.h> #include <stdlib.h> #include <string.h> int string2int(char *ar ...

  7. llinux环境变量查看和修改

    查看全局环境变量:env 查看所有环境变量:set 删除一个变量:unset [变量名] #只针对当前会话 设置一个变量:name=songjiankang export name #将这个变量提升为 ...

  8. Quercus-基于 Java 的 PHP 框架

    Quercus是Caucho公司采用纯Java开发的一个PHP5引擎.基于开源授权协议GPL发布.Quercus自带很多个PHP模块和扩展如 PDF,PDO,MySQL和JSON.可以利用这个引擎在一 ...

  9. 分享阿里云SLB-负载均衡的实现基本原理架构

    负载均衡技术原理浅析 https://help.aliyun.com/knowledge_detail/39444.html?spm=5176.7839438.2.6.XBbX5l 阿里定制版的LVC ...

  10. ASP.NET MVC 自定义Razor视图WorkContext

    概述 1.在ASP.NET MVC项目开发的过程中,我们经常需要在cshtml的视图层输出一些公用信息 比如:页面Title.服务器日期时间.页面关键字.关键字描述.系统版本号.资源版本号等 2.普通 ...