【cocos2d-js官方文档】十八、Cocos2d-js v3.0的对象构造和类继承

在Cocos2d-JS中,对象的构造方式和Cocos2d-x一样,使用各个类的create函数来构造。在Cocos2d-JS v3.0我们还将为你带来一种传统的方式,即使用new操作符。另外,在v3.0
alpha1版本中,因为我们还没有找到较好的解决办法,所以不能继承JSB中的引擎类。但是在v3.0 alpha2中,这个问题已经解决了。由于使用new操作符,编写继承代码也更加容易了。

在这篇文档中,我们将会介绍如何使用它们,以及简要的实现原理。

1.
弃用的create函数

由于Cocos2d-JS v3.0支持了更简单方便的new构造方式,所有create以及createWithXXX函数都被弃用了,调用它们将会收到警告消息。new构造方式支持所有类型的旧create函数的参数。

开发者有两种方式构造一个Sprite对象:统一的create函数和new操作符调用构造函数,它们接受相同的参数。在html5和jsb中都支持这2种方式,但是他们的实现原理大不相同。

2.
构造函数

我们现在可以直接使用new操作符来调用类的构造函数了。例如,开发者们应该使用new
cc.Sprite(...)
来创建一个cc.Sprite对象,在html5和jsb中都支持这种方式,但是他们的实现原理大不相同:

var sprite = new cc.Sprite(filename, rect);
var sprite = new cc.Sprite(texture, rect);
var sprite = new cc.Sprite(spriteFrameName);

在html5引擎中,我们重构了所有引擎类的ctor函数,使它们可以接受和create函数相同的参数。

在JSB中如果使用new操作符来调用cc.Sprite的构造函数,我们实际上在C++层会调用js_cocos2dx_Sprite_constructor函数。在这个C++函数中,会为这个精灵对象分配内存,并把它添加到自动回收池,然后调用js层的_ctor函数来完成初始化。在_ctor函数中会根据参数类型和数量调用不同的init函数,这些init函数也是C++函数的绑定:

Javascript JSB Cocos2d-x
cc.Sprite.initWithSpriteFrameName js_cocos2dx_Sprite_initWithSpriteFrameName cocos2d::Sprite::initWithSpriteFrameName
cc.Sprite.initWithSpriteFrame js_cocos2dx_Sprite_initWithSpriteFrame cocos2d::Sprite::initWithSpriteFrame
cc.Sprite.initWithFile js_cocos2dx_Sprite_initWithFile cocos2d::Sprite::initWithFile
cc.Sprite.initWithTexture js_cocos2dx_Sprite_initWithTexture cocos2d::Sprite::initWithTexture

这个过程的顺序图如下:

3.
继承

在Cocos2d-html5 2.x中,当我们继承一个类时,我们需要在create函数中使用不同的init函数,例如:

var MySprite = cc.Sprite.extend({
    ctor:function(){
        this._super();
        // 自定义初始化
    }
    // 添加自己的属性和方法
});
MySprite.create = function(filename,rect){
    var sprite = new MySprite();
    // 使用材质和矩形区域初始化
    sprite.initWithTexture(fileName, rect);
    return sprite;
};

// 创建你的精灵
var sprite = MySprite.create(texture,cc.rect(0,0,480,320));

在Cocos2d-JS中,我们只需要编写带有正确参数的ctor函数,并调用_super函数就可以了。

var MySprite = cc.Sprite.extend({
    ctor:function(filename,rect){
        this._super(filename,rect);
        // 自定义初始化
    }
    // 添加自己的属性和方法
});

// 创建你的精灵
var sprite = new MySprite(texture,cc.rect(0,0,480,320));

在html5引擎中这很好理解,因为我们支持使用new操作符。

但在JSB中这有点复杂,在_super函数中我们会调用Sprite的C++层ctor函数:js_cocos2dx_Sprite_ctor,这个函数不仅实例化精灵对象,也会调用cc.Sprite.prototype._ctor并传递参数。_ctor函数对精灵类真正的初始化函数做了封装,会根据传递的参数来调用不同的初始化函数,这样我们最终就完成了自定义ctor函数的执行。

这个过程的顺序图如下:

转载:http://www.cocos2dx.net/post/238

时间: 2024-12-15 06:52:11

【cocos2d-js官方文档】十八、Cocos2d-js v3.0的对象构造和类继承的相关文章

【cocos2d-js官方文档】五、Cocos2d-JS v3.0的新Action API

新增action中的方法 曾经,当我们须要反复一个action的时候,我们须要: sprite.runAction(cc.Repeat.create(action, 2)); 上面代码中创建了一个新的Repeat对象又一次包装action,这样无论在语义上还是代码上都比較难理解. 为什么我们不能像jQuery一样的简单方便的使用原action呢? 于是我们在新版本号中为action添加了新的方法: sprite.runAction(action.repeat(2)); 要循环action仅仅须要

ArcGIS API For JS官方文档解析教程

ArcGIS API For JavaScript(八)之Arcade ArcGIS API For JavaScript官方文档(一)之关于API ArcGIS API For JavaScript官方文档(一)之默认API配置 ArcGIS API For JavaScript官方文档(七)之编辑 ArcGIS API For Javascript官方文档(三)之从Web服务器取回数据 ArcGIS API For JavaScript官方文档(二)之默认的API字符串 ArcGIS API

【cocos2d-js官方文档】十八、Cocos2d-JS v3.0中的属性风格API

1. 新的API风格 我们直接来看看你可以如何使用Cocos2d-JS v3.0: 以前的API 新的API node.setPosition(x, y); node.x = x; node.y = y; node.setRotation(r); node.rotation = r; 如表格中可以看到的,设置position属性的函数调用在3.0版中会被替换为直接的对象属性存取.不仅仅是示例中的x,y和rotation,几乎所有节点类型中关于属性存取的函数都会被替换为直接的对象属性访问.具体的属

Hui 2.x.js 官方文档

基础方法 // 判断值是否是指定数据类型 var result = hui.isTargetType("白签软件", "string"); //=>true var result = hui.isTargetType(123, "number"); // =>true var result = hui.isTargetType("false", "boolean"); // =>false

node.js官方文档chm电子书的制作

制作软件:WebCHMSetup2.22.zip,http://www.onlinedown.net/soft/31553.htm 制作好的电子书:Node.js(v6.10.2).zip 参考链接:https://www.zhihu.com/question/37005587

【cocos2d-js官方文档】八、cc.game

概述 使用cc.game单例代替了原有的cc.Application以及cc.AppControl. 简化了工程启动代码的编写. 使用 首先在index.html中引入xxx/frameworks/cocos2d-html5/CCBoot.js. 然后开始进行入口代码编写,一般放在main.js中. 项目启动代码的编写较v2版本是大大的精简了,使用起来会更加舒服: cc.game.onStart = function(){ //load resources cc.LoaderScene.prel

bootbox.js官方文档

简介 Bootbox.js是一个小型的JavaScript库,基于Bootstrap模态框开发,用于创建可编程的对话框. 不像原生的alert等对话框,所有的Bootstrap模态框生成的都是非阻塞事件.所以 在使用confirm()对话框时,请记住这一点,因为它不是本地确认对话框的替代. 任何取决于用户选择的代码都必须放在回调函数中. alert alert是只有单个按钮的对话框,按ESC键或单击关闭按钮可关闭对话框. bootbox.alert("Your message here…&quo

Android 5.x OTA Update官方文档(八、图说Recovery UI)

写在前面: 若能直译,不会意译,意译不成,为了选择不误导他人也会漏译无伤大雅的部分,英语是硬伤,如果有误译,请路过的朋友帮忙指正,以免误导更多的朋友. RecoveryUI除了之前提到的标题.选项菜单.提示性文字还有另外的一个重要的成员图片.在正常的更新过程中,用户看到的仅仅是图片(这里指的标准的OTA升级流程,如开机进入recovery模式.安装更新时进度条发生变化,最后再开机进入正常模式),而且在这个过程,用户是没有机会与RecoveryUI进行交互的.但是一旦在更新过程中出现了异常,用户所

【cocos2d-js官方文档】二十一、v3相对于v2版本的api变动

CCAudio.js SimpleAudioEngine.js改名为CCAudio.js. AudioEngine中删除了以下几个方法: preloadMusic preloadEffect isFormatSupported preloadSound cc.AudioEngine.end被移到了实例中,而不是作为类的静态方法. cc.textureCache 删除了以下的几个api: cc.loadImg cc.loadImage.handler cc.computeImageFormatTy