Skip to content

Latest commit

 

History

History
75 lines (51 loc) · 3.82 KB

File metadata and controls

75 lines (51 loc) · 3.82 KB

#Object construction and class inheritance in Cocos2d-JS v3.0#

Object creation in Cocos2d-JS have always been the same way as in Cocos2d-x, that is using create functions of each class. In Cocos2d-JS v3.0 we'd like to introduce you the classic way to create an object: new operator. Moreover, in v3.0 alpha1, if you use JSB you will not be able to inherite many engine classes because we haven't found a perfect solution. But this have been solved in v3.0 alpha2. Thanks to the new operator support, the inheritance code is much more easier too.

In this document, we will introduce not only how to use them, but also some implementation explanation in brief.

##1. Deprecated create functions##

As we supported an easier way to create objects, all create and createWithXXX functions have been deprecated. new construction supports all parameter combinations for old create functions.

##2. Constructor##

In Cocos2d-JS 3.0, we can use the new operator to call classes' constructor now. For example, developers should create a Sprite object with the new operator, it's supported both in html5 and jsb, but the implementations of them are quiet different.

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

In html5 engine, we have refactored all in engine classes' ctor functions to support the same parameters as create functions.

In JSB, we actually call js_cocos2dx_Sprite_constructor in C++ level by using new operator of cc.Sprite. In this C++ function we allocate memory for this sprite and add it to autorelease pool, and then execute _ctor function in js level for initialization using initWithXXX functions, they are also supported in js bindings:

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

The sequence dialog of the process is showing below:

##3. Inheritance##

In Cocos2d-html5 2.x, we need to use different init functions in create function when extending a class, such as:

var MySprite = cc.Sprite.extend({
	ctor:function(){
		this._super();
		// Custom initialization
	}
	// add your properties and functions
});
MySprite.create = function(filename,rect){
	var sprite = new MySprite();
	// Init  with texture and rect
	sprite.initWithTexture(fileName, rect);
	return sprite;
};

// Create your sprite like this
var sprite = MySprite.create(texture,cc.rect(0,0,480,320));

In Cocos2d-JS, we only need to override ctor function with correct arguments, and call _super function.

var MySprite = cc.Sprite.extend({
	ctor:function(filename,rect){
		this._super(filename,rect);
		// Custom initialization
	}
	// add your properties and functions
});

// Create your sprite like this
var sprite = new MySprite(texture,cc.rect(0,0,480,320));

It's very easy to understand this for html5 engine, because we supported new operator.

But in JSB it's a little bit tricky, the _super function we will call Sprite's ctor function in C++ level: js_cocos2dx_Sprite_ctor, and this function not only instantiate the Sprite object, but also invoked cc.Sprite.prototype._ctor and pass all parameters. This _ctor function is a js level wrapper for the real initialization of the Sprite object according to the parameters passed, and finally user's custom ctor process will be done.

The sequence dialog of the process is showing below: