转自:http://www.cnblogs.com/fox7nights/archive/2013/02/21/2920640.html

一。调用代码

CCNode* GameOverScene::loadCCBI(const char * pCCBFileName, const char * pCCNodeName, CCNodeLoader * pCCNodeLoader)
{
CCNodeLoaderLibrary * ccNodeLoaderLibrary = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary(); if(pCCNodeName != NULL && pCCNodeLoader != NULL) {
ccNodeLoaderLibrary->registerCCNodeLoader(pCCNodeName, pCCNodeLoader);
} cocos2d::extension::CCBReader * ccbReader = new cocos2d::extension::CCBReader(ccNodeLoaderLibrary);
ccbReader->autorelease(); CCNode * node = ccbReader->readNodeGraphFromFile(pCCBFileName, this); if(node != NULL) {
this->addChild(node);
}
return node;
}

loadCCBI("gameover.ccbi","GameOverLayer",GameOverLayerLoader::loader());
其中pCCBFileName为调用文件名,pCCNodeName为ccbi文件中的根结点名,pCCNodeLoader为使用的加载器指针。

二。两个重要的类

CCNodeLoaderLibrary,这个类的作用是将字符串与加载器指针建立映射,因为C++是没有反射的。

ccNodeLoaderLibrary->registerCCNodeLoader(“A”, A);

这样的作用是使ccNodeLoaderLibrary在遇到"A"字符串的时候,就知道使用A这个类。

CCBReader的作用是实际的读取过程.在CCBReader.cpp中,我们能找到以下代码:

CCNodeLoader * ccNodeLoader = this->mCCNodeLoaderLibrary->getCCNodeLoader(className);
CCNode * node = ccNodeLoader->loadCCNode(pParent, this);

也就是说,实际调用的仍然是NodeLoder.

三。重要的dynamic_cast

那事件和变量,又是如何绑定的呢?

这就归功于dynamic_cast了,它可以在运行时根据对象的真实类型转换。

如果是两个不相关的对象,将转出空指针。如果是父类转子类,也是返回空指针,只有子类转父类的时候,返回的是真实指针。

CCNodeLoaderListener * nodeAsCCNodeLoaderListener = dynamic_cast<CCNodeLoaderListener *>(node);
if(nodeAsCCNodeLoaderListener != NULL) {
nodeAsCCNodeLoaderListener->onNodeLoaded(node, ccNodeLoader);
} else if(this->mCCNodeLoaderListener != NULL) {
this->mCCNodeLoaderListener->onNodeLoaded(node, ccNodeLoader);
}
if(target != NULL) {
  bool assigned = false;   CCBMemberVariableAssigner * targetAsCCBMemberVariableAssigner = dynamic_cast<CCBMemberVariableAssigner *>(target);   if(targetAsCCBMemberVariableAssigner != NULL) {
    assigned = targetAsCCBMemberVariableAssigner->onAssignCCBMemberVariable(target, memberVarAssignmentName, node);
  }   if(!assigned && this->mCCBMemberVariableAssigner != NULL) {
    this->mCCBMemberVariableAssigner->onAssignCCBMemberVariable(target, memberVarAssignmentName, node);
  }
}

以上的代码就是对变量和监听器的绑定的调用

cocos2d-x 将cocosbuilder输出文件映射成对象的原理的更多相关文章

  1. nand烧写分析/内核在启动过程中式如何将这个文件映射成/目录及各子目录的?

    我用的是ramdisk.image.gz,烧写在flash的0x10140000处 我不太明白内核在启动过程中式如何将这个文件映射成/目录及各子目录的? 如果ramdisk.image.gz在flas ...

  2. Result映射成对象和List

    package com.com.dbhelper; import java.lang.reflect.Field; import java.lang.reflect.Method; import ja ...

  3. 文件映射(Windows核心编程)

    映射内存的可执行文件和dll 当一个线程调用CreateProcess的时候,系统会执行以下步骤: 系统会先确定CreateProcess所指定的可执行文件的所在位置.如果找不到文件,那么Create ...

  4. php将文件转换成二进制输出[转]

    header( "Content-type: image/jpeg"); $PSize = filesize('1.jpg'); $picturedata = fread(fope ...

  5. (理论篇)从基础文件IO说起虚拟内存,内存文件映射,零拷贝

    为了快速构建项目,使用高性能框架是我的职责,但若不去深究底层的细节会让我失去对技术的热爱. 探究的过程是痛苦并激动的,痛苦在于完全理解甚至要十天半月甚至没有机会去应用,激动在于技术的相同性,新的框架不 ...

  6. less文件编译成微信小程序wxss文件

    2016年9月21日,微信小程序正式开启内测.在微信生态下,触手可及.用完即走的微信小程序引起广泛关注,刷爆朋友圈子.在这样的火爆氛围中,作为一个前端开发者的我,也悄悄地去尝鲜.在做demo小示例的过 ...

  7. 把java文件打包成.jar (jar命令详解)

    把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...

  8. 引用 运行asp.net程序时候,编译器错误消息: CS0016: 未能写入输出文件“c:\WINDOWS\Microsoft.NET\Fra

    引用 运行asp.net程序时候,编译器错误消息: CS0016: 未能写入输出文件“c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary A ...

  9. 自制 Python小工具 将markdown文件转换成Html文件

    今天看到了一个Python库,名为markdown.瞬间就给了我一个灵感,那就是制作一个将markdown文件转换成html文件的小工具. 我的实验环境 操作系统: Windows 7 64位 旗舰版 ...

随机推荐

  1. CentOS7.1 安装VMware Tools

    虚拟机——安装VMware Tools(Install VMware Tools),这时我们会在CentOS7系统桌面上发现VMware Tools的光盘图标. 双击这个图标,会发现VMwareToo ...

  2. Oracle > count(*) / count(0) / count(1) | order by 1, 2

    select count(*), select count(0), select count(1) from table 在统计表的行数时候,经常用到 select count(*) 然而对于行数很多 ...

  3. hdu4635Strongly connected

    http://acm.hdu.edu.cn/showproblem.php?pid=4635 tarjan缩点 统计缩点后每个结点的出度入度 将那个包含原来点数最少的 且出度或者入度为0的大节点看作一 ...

  4. poj2761

    表面上看是主席树之类的区间k大 实际上,除了主席树,还可以测各种结构 因为题目中说,任意区间不会完全包含 于是,我们把区间按左端点排序,依次添加,用平衡树求当前的k大 每个狗最多被添加一次,删除一次 ...

  5. JS框架整理

    1. Dojo (演示地址) Dojo是一个强大的面向对象JavaScript框架.主要由三大模块组成:Core.Dijit.DojoX.Core提供ajax,events,packaging,CSS ...

  6. 判断String为空

    1.  et_string.equals("")|| et_string==null 2.  ""用equal.null用== TextUtils.isEmpt ...

  7. I.MX6 Android frameworks services 文件架构

    /******************************************************************************* * I.MX6 Android fra ...

  8. I.MX6 wm8962 0-001a: DC servo timed out

    /******************************************************************************* * I.MX6 wm8962 0-00 ...

  9. 【Java】Java运行cmd命令直接导出.sql文件

    Java中的Runtime.getRuntime().exec(commandStr)可以调用执行cmd命令 package Util; import java.io.File; import jav ...

  10. 【转】iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势) -- 不错不错

    原文网址:http://blog.csdn.net/totogo2010/article/details/8615940 1.UIGestureRecognizer介绍 手势识别在iOS上非常重要,手 ...