这是我自己总结的cocos2dx,方便自己查看和复习。所以不一定适合您。
//
// ImageScene.h
// sceneDemo
//
// Created by sixleaves on 14-7-29.
//
//
#ifndef __sceneDemo__ImageScene__
#define __sceneDemo__ImageScene__
#include "cocos2d.h"
class ImageScene : public cocos2d::Layer
{
public:
static cocos2d::Scene * createScene();
virtual bool init();
CREATE_FUNC(ImageScene);
};
#endif /* defined(__sceneDemo__ImageScene__) */
/*
总结:
知识点一:
Scene场景类、Layer层的概念
其实Scene是一对多得关系,一个场景类可以有多个Layer层。
实质上Scene就是由Layer层构成的。他们的关系,你可以看成
是树的结构,而且Scene和Layer都继承自Node类,所以其都
能有addChild方法,所以Scene可以把Layer添加进去。
知识点二:宏定义的两个应用
1.在预编译时期的过滤应用(防御性措施)
#ifndef __xxXXxxX_H__
#define __xxXXxxX_H__
insert #include code
#endif
这样在当包含两次时,就会过滤掉下一次包含。
2.宏函数
可以查看CREATE_FUNC的定义:
如下
#define CREATE_FUNC(__TYPE__) \
static __TYPE__* create() \
{ \
__TYPE__ *pRet = new __TYPE__(); \
if (pRet && pRet->init()) \
{ \
pRet->autorelease(); \
return pRet; \
} \
else \
{ \
delete pRet; \
pRet = NULL; \
return NULL; \
} \
}
“\”号的意义:首先宏函数其实本质上必须写成一行,
而\只是在编程中对于不方便写在一行的代码的格式化
它告诉编译器,我这一行还没结束,把下面的继续整合
上来成为一行。而在此处,这样写是为了提高可读性。
该函数的作用:创建指定对象,并且调用这个对象的构造函数(init)。
知识点三:C++中的多态
对于同一个父类的类,调用的方法,取决于对象,这种形式的多态
需要将父类中相应地方法定义为virutal即可。其实这就是java
中的尽量使用借口引用的原因、其就是为了适应多态,区别在于C++
中比较啰嗦,而java是默认就是有virtual这种功能的。不用你再写
明。
所以为了能够在创建这个对象后调用其构造函数init。需要重写它
这就是为什么其父类将其声明为virtual的原因。至于createScene
纯粹就是工厂方法。
*/
createScene主要还是分别调用Scene类和自定义layer类的工厂方法create创建对象,让后将其添加到Scene对象中。
//
// ImageScene.cpp
// sceneDemo
//
// Created by sixleaves on 14-7-29.
//
//
#include "ImageScene.h"
USING_NS_CC;
Scene * ImageScene::createScene() {
auto scene = Scene::create();
auto imageScene = ImageScene::create();
scene->addChild(imageScene);
return scene;
}
bool ImageScene::init() {
Size size = Director::getInstance()->getVisibleSize();
auto sprite = Sprite::create("CloseSelected.png");
sprite->setPosition(size.width/2, size.height/2);
addChild(sprite);
return true;
}