适用版本:v3.0-beta2及更高版本

两阶段构造器及静态create()函数

在Cocos2d-x引擎中,我们使用了两阶段构造器,这不仅指Objective-C实现文件(implementation),也与Symbian SDK及Bada SDK相似。我认为这一举措在C++编程中很不错。

第一阶段是运行C++类构造器。在C++类的默认构造器中,成员变量须设定为默认值。但我们不应在默认构造器中编写任何逻辑。例如

MyClass::MyClass()  // c++ class constructor
:_data(NULL)      // set all member variables to default values,_flag(false),_count(0)
{
    memset(_array,0,sizeof(_array));   // only set default values here,but not logics
}

我们之所以不应在这里编写任何逻辑,是因为C++默认构造器不能返回表明我们逻辑正确与否的bool 值。

使用C++关键词try/catch(捕获/异常)同样会给调用方返回失败状态,但是使用catch(捕获/异常)显然将增加你源代码编译后的二进制文件的大小。

第二阶段是调用MyClass::init()函数,如下。

bool MyClass::initWithFilename(const std::string& filename)
{
    // just take loading texture as a sample,this behavIoUr can fail if the image file doesn't exist. 
    bool bReturnValue = loadTextureIntoMemory(filename);  
    return bReturnValue;
}

所以,我们可以构建如下

MyClass* obj = new MyClass;
 if (true == obj->initWithFilename("texture.png"))
 {
     // congratulations,go ahead!
 }
 else
 {
     // error process
 }

在Cocos2d-x引擎中,我们已对这一两阶段构造器进行包装,并在静态函数create()中自动释放引用计数。除了单例模式,每一个cocos2d类都有自己的static Ccclass* Ccclass::create(...)方法。极力推荐这一方法。代码样本:

Sprite* monster = Sprite::create("Monster.png");
monster->setPosition(ccp(visibleSize.width/2 + origin.x,visibleSize.height/2 + origin.y));
this->addChild(monster);

所以,如果你希望新建cocos2d的对象,比如Sprite,Label,Action,你必须首先从头文件或API文件中找到它的CocosClass::create() 方法。

doSomething()这是最常见的函数名,在Cocos2d-x/-html5引擎中处处都有应用到。第一个字是一个动词,第二个字是一个名词。比如:replaceScene(CCScene*)getTexture()

doWithResource()它是doSomething()方法的变体。在initWithTexture(CCTexture*)initWithFilename(const std::string&)中,你经常可以看见这一函数名。

onEventCallback()当你看到类似void onEnter()的函数名时,onAction类型表明这是一个回调函数。当引发一定条件时,其他类将调用这一方法。比如:
class Layer
{
public:
    virtual void onEnter();
    onExit();
    onEnterTransitionDidFinish();
}

getInstance()在Cocos2d-x引擎中,如果你没有发现create(),只发现了getInstance()方法,它就属于单例模式类。比如,TextureCache::getInstance()。单例类对应的析构方式是destroyInstance()。 在v3.0之前,单例类的构造方式是CocosClass::sharedCocosClass(),比如TextureCache::sharedTextureCache()。这个方法在v3.0中仍然可以兼容,但不保证在v3.0更后面的版本中仍然保留。

属性因为在C++ 和 C++11中没有"property" (“属性”)这个概念,所以我们在Cocos2d-x引擎中使用了许多getter和setters。

setProperty()

改变属性的值。这通常会影响到对象的行为。比如_sprite->setPosition(ccp(0,0))会将精灵移动到左下角。

getproperty()与setProperty不同,getProperty将不会改变对象的成员变量及行为。比如,我们通常使用_director->getVisibleSize().width获得可见大小或窗口大小以计算对象的方位。

getproperty()函数的默认类型如下:

const CCSize& getSize() const;

首先,根据性能优化,在此,我们返回CCSize引用,而不是构建另一个CCSize。当改变这一CCSize&时,该对象的内部成员变量将会受到影响,所以这一CCSize&属于常量。

第二,getSize()方法不应改变该对象的其他成员变量,所以这一函数本身属于常量。

isproperty()和getProperty一样,但会返回一个boolean值。

总结起来:

  • 如果属性为“只读”,将不会有setProperty(type)方法;
  • 如果属性为一个bool值,将会有setProperty(bool)isproperty()方法。 比如:Sprite::isDirty()Sprite::setDirty(bool bDirty)
  • 如果属性不是一个bool值,将会有setProperty(type)getproperty()方法。比如:void Sprite::setTexture(Texture2D*)Texture2D* CCSprite::getTexture()

Cocos API风格说明(摘自官方文档)的更多相关文章

  1. 寒城攻略:Listo 教你 25 天学会 Swift 语言 - 22 Extensions

    //***********************************************************************************************//1.Extensions(扩展)//___________________________________________________________________________________

  2. 【Swift初见】Swift构造过程

    构造过程是通过构造器来实现的,其实每个构造器就可以看作是一个函数,只是这个函数是为了执行初始化的。每个类都必须拥有一个指定构造器。

  3. Swift 2

    letlabel="Thewidthis"letwidth=94letwidthLabel=label+String练习:删除最后一行中的String,错误提示是什么?你可以一起使用if和let来处理值缺失的情况。switch支持任意类型的数据以及各种比较操作——不仅仅是整数以及测试相等。运行switch中匹配到的子句之后,程序会退出switch语句,并不会继续向下运行,所以不需要在每个子句结尾写break。

  4. swift之inherit

    新的Bicycle类自动获得Vehicle类的特性,比如maxPassengers和numberOfWheels属性。Car重写了继承来的description方法,它的声明与Vehicle中的description方法一致,声明前面加上了override关键字。Car中的description方法并非完全自定义,而是通过super.desc

  5. swift之constructor

    所以我们将属性回答response声明为String?当SurveyQuestion实例化时,它将自动赋值为空nil,表明暂时还不存在此字符串。下面例子中创建了一个类ShoppingListItem,它封装了购物清单中的某一项的属性:名字、数量和购买状态purchasestate。上面例子中使用默认构造器创造了一个ShoppingListItem类的实例,并将其赋值给变量item。Swift可以根据这两个属性的初始赋值0.0自动推导出它们的类型Double。

  6. Swift教程16-使用Swift调用AFNetworking进行网络请求

    如何使用Swift进行网络请求呢?

  7. 五 Swift学习之扩展(Extension)

  8. Swift 构造器探究

    Swift构造器探究什么时候要用构造器?然而Swift的构造器又有两种,一种是designated构造器,一种是convenience构造器。所有designated构造器都必须初始化那些没有满足第一种情况的存储属性。具体怎么做请看后文Designated构造器对于结构体Swift中结构体和类的构造器其实差不多。构造器的继承designated构造器designated构造器在Swift中很常见,顾名思义这个构造器就是你类中所有构造器的“原型”。在这个构造器中只调用父类的designated构造器或者不调

  9. swift1.2新增和改动

    Swift语言的改变“确保转换”和“可失败转换”的概念现在被分为两个操作符。从桥接Objective-C类到它Swift中值类型的隐式转化被移除。这将是Swift的类型系统更加简单和可预测。柯里化函数现在可以指定参数标签了:Swift现在可以检测在Swift类型系统中覆盖和重写的差异以及通过Objective-C运行时可见的影响。

  10. Swift学习笔记-面向对象

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部