cocos2d-x HelloWorld基本原理
2013-08-21 09:25
501 查看
转载:http://blog.csdn.net/wenzi6886/article/details/8520210
我觉得讲一个东西还是要从HelloWorld开始讲。
1.导演类
用VS新建一个Cocos2d-X工程,然后自己帮我们生成一个HelloWorld工程,然后看看AppGelegate.app文件,里面有这个函数:
[cpp] view
plaincopy
bool AppDelegate::applicationDidFinishLaunching()
{
// initialize director
CCDirector *pDirector =CCDirector::sharedDirector();
pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
// enable High Resource Mode(2x, such as iphone4) and maintains low resource on other devices.
// pDirector->enableRetinaDisplay(true);
// turn on display FPS
pDirector->setDisplayStats(true);
// set FPS. the default value is 1.0/60 if you don't call this
pDirector->setAnimationInterval(1.0 / 60);
// create a scene. it's an autorelease object
CCScene *pScene =HelloWorld::scene();
// run
pDirector->runWithScene(pScene);
return true;
}
CCDirector类,是导演类,在Cocos2d-X的里,构建一个游戏,就是构建一个世界,这个世界由导演类去指导演绎,于是,在打开游戏的第一步时,导演告诉程序:
pDirector->setDisplayStats(true); //要显示FPS数值,方便我查看游戏效率
pDirector->setAnimationInterval(1.0 / 60); //游戏每秒播放多少帧(这里是60帧)
pDirector->runWithScene(pScene); //进入游戏,首先要显示哪个场景
于是代码都很简单,主要是要留意,一个类继承了CCScene就可以作为场景使用,然后用导演类的runWithScene方法运行游戏的第一个场景,但是以后切换场景就要用replaceScene方法了。
2. 自定义场景
接下来我们来看看自定义的场景类,先看看HelloWorldScene.h头文件
[cpp] view
plaincopy
class HelloWorld : public cocos2d::CCLayer
{
public:
virtual bool init();
static cocos2d::CCScene* scene();
void menuCloseCallback(CCObject* pSender);
CREATE_FUNC(HelloWorld);
};
menuCloseCallback我觉得它应该是一个回调函数,没了,仅此而已,就是Android的OnClickListener里面的onClick函数一样,但是又有点不一样!
scene函数是不可缺的,它是CCLayer的类,HelloWorld里要重写这个函数的。那scene函数在哪个地方会用到?还记得之前那段代码吗?新建一个场景类的时候是这样的:
[cpp] view
plaincopy
// create a scene. it's an autorelease object
CCScene *pScene =HelloWorld::scene();
// run
pDirector->runWithScene(pScene);
再来看看CREATE_FUNC(HelloWorld);这个我纠结了很久,CREATE_FUNC是一个宏(应该是的,我C++很差的哈!):
[cpp] view
plaincopy
#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; \
} \
}
CREATE_FUNC实际上就是create函数,准确的说,是重写了CCLayer里的create函数,看看CCLayer的create函数:
[cpp] view
plaincopy
CCLayer *CCLayer::create()
{
CCLayer *pRet =newCCLayer();
if (pRet &&pRet->init())
{
pRet->autorelease();
return pRet;
}
else
{
CC_SAFE_DELETE(pRet);
return NULL;
}
}
是的,CREATE_FUNC的作用只不过是把create的返回值改成继承了CCLayer的实际子类
HelloWorldScene.cpp里是怎么重写scene函数的:
[cpp] view
plaincopy
CCScene* HelloWorld::scene()
{
CCScene * scene = NULL;
do
{
// 'scene' is an autorelease object
scene = CCScene::create();
CC_BREAK_IF(! scene);
// 'layer' is an autorelease object
HelloWorld *layer =HelloWorld::create();
CC_BREAK_IF(! layer);
// add layer as a child to scene
scene->addChild(layer);
} while (0);
// return the scene
return scene;
}
于是我们发现了,虽然HelloWorld自称是场景类,但是导演要的并不是它~!导演还是要了一个真正的CCScene类,你看:
scene = CCScene::create();
这里创建了一个真正的CCScene类。
一个场景类应该是继承了CCLayer,然后这个场景类有一个scene函数,这个函数会新建一个CCScene对象。
再看:
HelloWorld *layer =HelloWorld::create();
scene->addChild(layer);
HelloWorld只是作为一个layer(一个层),它被添加到刚刚创建的那个CCScene类了。好吧,现实很残酷,尽管HelloWorld继承了场景类,可它依旧不是一个真正的场景~!
好,紧接着,不要放松,还记得刚刚create函数里有这几句吗?
[cpp] view
plaincopy
if (pRet &&pRet->init())
{
pRet->autorelease();
return pRet;
}
也就是说,场景类的init函数是一定会被调用的。
于是,这就表示,继承了CCScene的类,必须要有这三个家伙:
[cpp] view
plaincopy
public:
virtual bool init();
static cocos2d::CCScene* scene();
CREATE_FUNC(HelloWorld);
};
3.最后的最后,当然是总结
1). HelloWorld工程主要就是教我们创建一个场景类
2). AppDelegate.cpp里会创建第一个显示的场景类,此时用的方法是runWithScene
3).要新建一个场景类,就一定要有以下三个函数:
virtual bool init(); // 初始化,可以在这里创建精灵
static cocos2d::CCScene* scene(); // 在这里要自己新建一个CCScene类,然后把我们自定义的场景类作为一个CCLayer添加到这个CCScene类中
CREATE_FUNC(HelloWorld); //相当于重写create函数,让create函数返回子类对象。
4. 然后,就是这样了。
好了,以上就是我从HelloWorld工程能够发现的东西了,肯定会有不少错误的思想,但是现在的我还无法修正。所以,仅供参考,嘿嘿~
我觉得讲一个东西还是要从HelloWorld开始讲。
1.导演类
用VS新建一个Cocos2d-X工程,然后自己帮我们生成一个HelloWorld工程,然后看看AppGelegate.app文件,里面有这个函数:
[cpp] view
plaincopy
bool AppDelegate::applicationDidFinishLaunching()
{
// initialize director
CCDirector *pDirector =CCDirector::sharedDirector();
pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
// enable High Resource Mode(2x, such as iphone4) and maintains low resource on other devices.
// pDirector->enableRetinaDisplay(true);
// turn on display FPS
pDirector->setDisplayStats(true);
// set FPS. the default value is 1.0/60 if you don't call this
pDirector->setAnimationInterval(1.0 / 60);
// create a scene. it's an autorelease object
CCScene *pScene =HelloWorld::scene();
// run
pDirector->runWithScene(pScene);
return true;
}
CCDirector类,是导演类,在Cocos2d-X的里,构建一个游戏,就是构建一个世界,这个世界由导演类去指导演绎,于是,在打开游戏的第一步时,导演告诉程序:
pDirector->setDisplayStats(true); //要显示FPS数值,方便我查看游戏效率
pDirector->setAnimationInterval(1.0 / 60); //游戏每秒播放多少帧(这里是60帧)
pDirector->runWithScene(pScene); //进入游戏,首先要显示哪个场景
于是代码都很简单,主要是要留意,一个类继承了CCScene就可以作为场景使用,然后用导演类的runWithScene方法运行游戏的第一个场景,但是以后切换场景就要用replaceScene方法了。
2. 自定义场景
接下来我们来看看自定义的场景类,先看看HelloWorldScene.h头文件
[cpp] view
plaincopy
class HelloWorld : public cocos2d::CCLayer
{
public:
virtual bool init();
static cocos2d::CCScene* scene();
void menuCloseCallback(CCObject* pSender);
CREATE_FUNC(HelloWorld);
};
menuCloseCallback我觉得它应该是一个回调函数,没了,仅此而已,就是Android的OnClickListener里面的onClick函数一样,但是又有点不一样!
scene函数是不可缺的,它是CCLayer的类,HelloWorld里要重写这个函数的。那scene函数在哪个地方会用到?还记得之前那段代码吗?新建一个场景类的时候是这样的:
[cpp] view
plaincopy
// create a scene. it's an autorelease object
CCScene *pScene =HelloWorld::scene();
// run
pDirector->runWithScene(pScene);
再来看看CREATE_FUNC(HelloWorld);这个我纠结了很久,CREATE_FUNC是一个宏(应该是的,我C++很差的哈!):
[cpp] view
plaincopy
#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; \
} \
}
CREATE_FUNC实际上就是create函数,准确的说,是重写了CCLayer里的create函数,看看CCLayer的create函数:
[cpp] view
plaincopy
CCLayer *CCLayer::create()
{
CCLayer *pRet =newCCLayer();
if (pRet &&pRet->init())
{
pRet->autorelease();
return pRet;
}
else
{
CC_SAFE_DELETE(pRet);
return NULL;
}
}
是的,CREATE_FUNC的作用只不过是把create的返回值改成继承了CCLayer的实际子类
HelloWorldScene.cpp里是怎么重写scene函数的:
[cpp] view
plaincopy
CCScene* HelloWorld::scene()
{
CCScene * scene = NULL;
do
{
// 'scene' is an autorelease object
scene = CCScene::create();
CC_BREAK_IF(! scene);
// 'layer' is an autorelease object
HelloWorld *layer =HelloWorld::create();
CC_BREAK_IF(! layer);
// add layer as a child to scene
scene->addChild(layer);
} while (0);
// return the scene
return scene;
}
于是我们发现了,虽然HelloWorld自称是场景类,但是导演要的并不是它~!导演还是要了一个真正的CCScene类,你看:
scene = CCScene::create();
这里创建了一个真正的CCScene类。
一个场景类应该是继承了CCLayer,然后这个场景类有一个scene函数,这个函数会新建一个CCScene对象。
再看:
HelloWorld *layer =HelloWorld::create();
scene->addChild(layer);
HelloWorld只是作为一个layer(一个层),它被添加到刚刚创建的那个CCScene类了。好吧,现实很残酷,尽管HelloWorld继承了场景类,可它依旧不是一个真正的场景~!
好,紧接着,不要放松,还记得刚刚create函数里有这几句吗?
[cpp] view
plaincopy
if (pRet &&pRet->init())
{
pRet->autorelease();
return pRet;
}
也就是说,场景类的init函数是一定会被调用的。
于是,这就表示,继承了CCScene的类,必须要有这三个家伙:
[cpp] view
plaincopy
public:
virtual bool init();
static cocos2d::CCScene* scene();
CREATE_FUNC(HelloWorld);
};
3.最后的最后,当然是总结
1). HelloWorld工程主要就是教我们创建一个场景类
2). AppDelegate.cpp里会创建第一个显示的场景类,此时用的方法是runWithScene
3).要新建一个场景类,就一定要有以下三个函数:
virtual bool init(); // 初始化,可以在这里创建精灵
static cocos2d::CCScene* scene(); // 在这里要自己新建一个CCScene类,然后把我们自定义的场景类作为一个CCLayer添加到这个CCScene类中
CREATE_FUNC(HelloWorld); //相当于重写create函数,让create函数返回子类对象。
4. 然后,就是这样了。
好了,以上就是我从HelloWorld工程能够发现的东西了,肯定会有不少错误的思想,但是现在的我还无法修正。所以,仅供参考,嘿嘿~
相关文章推荐
- cocos2d-x-3.3rc2-001-hello-world
- Cocos2d-x——HelloWorldScene.cpp的详解
- Cocos2d-x HelloWorld 之源码分析
- cocos2d-x 3.0 开发(一) Hello_New_World
- How To Make A Simple WoPhone Game With Cocos2d-x : How To Run Hello World
- cocos2d-x 3.0 开发(一) Hello_New_World
- Chapter1-怎么在visual studio 2012上运行第一个cocos2d-x项目:Hello World!
- cocos2D中HelloWorldScene.h和HelloWorldScene.cpp的简单解释
- cocos2d-x 3.0 开发(一) Hello_New_World
- cocos2d-x helloworld 分析
- 在Window+VS2010 下新建Cocos2D-X HelloWorld 项目
- cocos2d-x 3.0 开发(一) Hello_New_World
- cocos2D中HelloWorldScene.h和HelloWorldScene.cpp
- 在android真机上运行cocos2d-html5-2.2自带的HelloHTML5World和其它demo
- (原)cocos2d笔记——解析HelloWorldAppDelegate
- cocos2d-x: 死磕"HelloWorld"(1)——入口函数及其带来的疑问
- Cocos2d-x简单游戏<打飞机>代码实现|第四部分:主场景<Helloworld.h>
- cocos2d 游戏开发:Cocos2d v3 "hello world"+显示飞船
- cocos2d-x: 死磕"HelloWorld"(2)——应用实例的创建
- cocos2d-x 3.0 开发(一) Hello_New_World