cocos2d-x学习笔记(1)

前端之家收集整理的这篇文章主要介绍了cocos2d-x学习笔记(1)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

工程创建:

打开Windows的cmd窗口,输入一下命令



HelloWorld就是项目名称,-p(package)后面接着就是项目的包名,-l(language)后面指定语言版本,-d后面指定项目路径。

记得!!!要把Python添加到环境变量。


打开HelloWorld项目的AppDelegate.cpp文件,applicationDidFinishLaunching()函数

  1. bool AppDelegate::applicationDidFinishLaunching() {
  2. // initialize director
  3. auto director = Director::getInstance();
  4. auto glview = director->getOpenGLView();
  5. if(!glview) {
  6. glview = GLViewImpl::create("My Game");
  7. director->setOpenGLView(glview);
  8. }
  9.  
  10. // turn on display FPS
  11. director->setDisplayStats(true);//设置是否显示游戏的帧数等调试信息
  12.  
  13. // set FPS. the default value is 1.0/60 if you don't call this
  14. director->setAnimationInterval(1.0 / 60);//设置游戏的帧数,在这里是每秒60帧
  15.  
  16. register_all_packages();
  17.  
  18. // create a scene. it's an autorelease object
  19. auto scene = HelloWorld::createScene();//创建一个场景
  20.  
  21. // run
  22. director->runWithScene(scene);//运行场景
  23.  
  24. return true;
  25. }


场景类的分析

HelloWorld.h头文件

  1. #include "cocos2d.h"
  2.  
  3. class HelloWorld : public cocos2d::Layer
  4. {
  5. public:
  6. // there's no 'id' in cpp,so we recommend returning the class instance pointer
  7. static cocos2d::Scene* createScene();
  8.  
  9. // Here's a difference. Method 'init' in cocos2d-x returns bool,instead of returning 'id' in cocos2d-iphone
  10. virtual bool init();
  11. // a selector callback
  12. void menuCloseCallback(cocos2d::Ref* pSender);//回调函数
  13. // implement the "static create()" method manually
  14. CREATE_FUNC(HelloWorld);
  15. };

createScene函数是不可缺的。新建一个场景类的时候是这样的:
  1. auto scene = HelloWorld::createScene();//创建一个场景

在Cocos2d-x 3.0里,都是通过这样的方式来创建一个场景对象,不一定要命名为scene,但在整个程序里要统一。


CREATE_FUNC(HelloWorld),CREATE_FUNC是一个宏。CREATE_FUNC是一个宏函数,具体实现如下:

  1. #define CREATE_FUNC(__TYPE__) \
  2. static __TYPE__* create() \
  3. { \
  4. __TYPE__ *pRet = new(std::nothrow) __TYPE__(); \
  5. if (pRet && pRet->init()) \
  6. { \
  7. pRet->autorelease(); \
  8. return pRet; \
  9. } \
  10. else \
  11. { \
  12. delete pRet; \
  13. pRet = NULL; \
  14. return NULL; \
  15. } \
  16. }


和普通函数的最大区别有三处:

1)用#define定义,并且没有返回值;

2)参数没有类型,只有参数名;

3)每一行结尾处都有一个“\”符号;“\”符号是c++代码书写时用于换行的。


然后参数_TYPE_其实是宏里面的宏,因为在编译时,这个宏函数里会直接把_TYPE_出现的地方用_TYPE的值替换掉。比如之前的CREATE_FUNC(HelloWorld)。这个代码在编译时会转换为代码如下:

  1. static HelloWorld* create(){
  2. HelloWorld *pRet=new HelloWorld();
  3. if(pRet && pRet->init()){
  4. pRet->autorelease();
  5. return pRet;
  6. }
  7. else {
  8. delete pRet;
  9. pRet=NULL;
  10. return NULL;
  11. }
  12. }

就是把_TYPE_换成了HelloWorld。



再看createScene函数。在HelloWorldScene.cpp中可以看到createScene函数的实现:

  1. <pre name="code" class="cpp">Scene* HelloWorld::createScene()
  2. {
  3. // 'scene' is an autorelease object
  4. auto scene = Scene::create();//创建一个场景类。这个场景类并不是HelloWorld本身
  5. // 'layer' is an autorelease object
  6. auto layer = HelloWorld::create();//创建HelloWorld对象,create函数正是宏CREATE_FUNC(HelloWorld)定义的
  7. //HelloWorld继承了Layer类, Layer不是Scene场景类。换句话说,HelloWorld并不是一个场景类
  8. // add layer as a child to scene
  9. scene->addChild(layer);//将layer对象添加到scene对象
  10.  
  11. // return the scene
  12. return scene;//返回scene对象
  13. }


  1.  

1)通过auto scene=HelloWorld::crateScene()创建一个场景对象;

2)HelloWorld的createScene函数里面创建了一个场景对象(Scene),然后将HelloWorld对象(Layer)添加到场景对象;

3)HelloWorld对象通过crate函数创建,而create函数是由宏CREATE_FUNC(HelloWorld)来定义的;

4)通过director->runWithScene(scene)让场景对象显示在窗口中。

猜你在找的Cocos2d-x相关文章