今天开始学习cocos代码,首先研究源码中的空程序。


在这个程序中,在main函数中,创建了一个Application:
  1. int APIENTRY _tWinMain(HINSTANCE hInstance,
  2. HINSTANCE hPrevInstance,
  3. LPTSTR lpCmdLine,
  4. int nCmdShow)
  5. {
  6. UNREFERENCED_PARAMETER(hPrevInstance);
  7. UNREFERENCED_PARAMETER(lpCmdLine);
  8. // create the application instance
  9. AppDelegate app;
  10. return Application::getInstance()->run();
  11. }

其中AppDelegate继承自Application。这里明显使用了单例模式,AppDelegate构造时,Application内部的静态成员指针被赋值:
  1. Application::Application()
  2. : _instance(nullptr)
  3. , _accelTable(nullptr)
  4. {
  5. _instance = GetModuleHandle(nullptr);
  6. _animationInterval.QuadPart = 0;
  7. CC_ASSERT(! sm_pSharedApplication);
  8. sm_pSharedApplication = this;
  9. }
其中sm_pSharedApplication即为静态成员。之后getInstance函数,便是返回了这个成员:
  1. Application* Application::getInstance()
  2. {
  3. CC_ASSERT(sm_pSharedApplication);
  4. return sm_pSharedApplication;
  5. }
在main函数调用run之后,AppDelegate::applicationDidFinishLaunching会被调用,这个函数是一个虚函数,需要由用户指定实现。
在这个函数中,用户需要创建自己的场景。具体做法是,获取一个Director指针(Director也是单例模式),最后调用Director::runWithScene函数,把用户自定义的Scene加入:
  1. bool AppDelegate::applicationDidFinishLaunching() {
  2. // initialize director
  3. auto director = Director::getInstance();
  4. auto glview = director->getOpenGLView();
  5. if(!glview) {
  6. glview = GLViewImpl::create("Cpp Empty Test");
  7. director->setOpenGLView(glview);
  8. }
  9. director->setOpenGLView(glview);
  10. // turn on display FPS
  11. director->setDisplayStats(true);
  12. // set FPS. the default value is 1.0/60 if you don't call this
  13. director->setAnimationInterval(1.0 / 60);
  14. // create a scene. it's an autorelease object
  15. auto scene = HelloWorld::scene();
  16. // run
  17. director->runWithScene(scene);
  18. return true;
  19. }
上面代码中的HelloWorld是用户定义的类:
  1. class HelloWorld : public cocos2d::Layer
  2. {
  3. public:
  4. // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
  5. virtual bool init();
  6. // there's no 'id' in cpp, so we recommend returning the class instance pointer
  7. static cocos2d::Scene* scene();
  8. // a selector callback
  9. void menuCloseCallback(Ref* sender);
  10. // implement the "static node()" method manually
  11. CREATE_FUNC(HelloWorld);
  12. };
实际上HelloWorld本身是一个Layer,调用scene函数的时候,会创建一个Scene的实例,调用scene的addChild函数把自身的一个实例加进去:
  1. Scene* HelloWorld::scene()
  2. {
  3. // 'scene' is an autorelease object
  4. auto scene = Scene::create();
  5. // 'layer' is an autorelease object
  6. HelloWorld *layer = HelloWorld::create();
  7. // add layer as a child to scene
  8. scene->addChild(layer);
  9. // return the scene
  10. return scene;
  11. }
在create函数当中,会调用HelloWorld的init函数,这个函数是一个虚函数,在这个函数中,可以完成用户自身的初始化工作,例如加入菜单项,创建各种组成场景的元素。

总结一下,总的调用顺序是:
main调用Application::run
AppDelegate::applicationDidFinishLaunching被调用
创建Layer,Layer的init函数被调用
创建Scene,把Layer加进scene
获得Director指针(只有一个director),把Scene加进Director






学习cocos 空程序的更多相关文章

  1. Xamarin.Android学习之应用程序首选项

    Xamarin.Android学习之应用程序首选项 一.前言 任何App都会存在设置界面,如果开发者利用普通控件并绑定监听事件保存设置,这一过程会非常的枯燥,而且耗时.我们可以看到Android系统的 ...

  2. 与大家分享学习微信小程序开发的一些心得

    因为我也才开始学习微信小程序不久,下文也是现在的一时之言,大家有不同的想法也可以在评论里共同交流讨论,希望文章能给大家提供一点点帮助. 最近接触到了一些前端框架,像Vue.js,React,发现小程序 ...

  3. 毕业设计预习:VHDL入门知识学习(一) VHDL程序基本结构

    VHDL入门知识学习(一) VHDL程序基本结构 简介 VHDL程序基本结构 简介 概念: HDL-Hardware Description Language-硬件描述语言-描述硬件电路的功能.信号连 ...

  4. 13本热门书籍免费送!(Python、SpingBoot、Entity Framework、Ionic、MySQL、深度学习、小程序开发等)

    七月第一周,网易云社区联合清华大学出版社为大家送出13本数据分析以及移动开发的书籍(Python.SpingBoot.Entity Framework.Ionic.MySQL.深度学习.小程序开发等) ...

  5. python学习笔记-python程序运行

    小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...

  6. 学习cocos code ide 的lua编程

    装上了cocos code ide,配了路径之后,建立一个默认lua工程,发现无法调试,报错. 问了别人,在cocos2dconstants.lua的613行插入cc.AsyncTaskPool  = ...

  7. CMake学习(1)---简单程序与库

    cmake是linux平台下重要的工具,可以方便的组织makefile.之前一直在windows平台下进行软件开发,在vs2010的IDE里,只要一点run程序就能跑出结果.但是程序的编译并没有那么简 ...

  8. 重构遗留程序的一次案例学习(java程序)

    遗留代码经常是腐臭的,每个优秀的开发者都想把它重构.而进行重构的一个理想的先决条件是,它应该包含一组单元测试用例,以避免产生回归缺陷.但是为遗留代码编写单元测试可不是件容易的事,因为它经常是一团糟.要 ...

  9. java 学习 ——计算器小程序

    简易计算器小程序代码: package jisuanqi; //声明须要插入的包 import java.awt.*; import java.lang.Object; import java.lan ...

随机推荐

  1. Hosting socket.io WebSocket apps in IIS using iisnode

    In this post I explain how to configure a socket.io node.js application to use of WebSockets when ho ...

  2. Mac本“安全性与隐私”里没有“任何来源”选项

    打开"偏号设置"----->"安全性与隐私"----->"通用",里面没有"任何来源",怎么解决? 如果需要 ...

  3. JS DOM学习笔记

    1.window对象代表当前浏览器窗口 2.使用window对象的属性.方法的时候可以省略window.例如:window.alert("hello")一般写成alert(&quo ...

  4. Android项目实战(十九):Android Studio 优秀插件: Parcelable Code Generator

    Android Studio 优秀插件系列: Android Studio 优秀插件(一):GsonFormat Android Studio 优秀插件(二): Parcelable Code Gen ...

  5. GIT在iOS开发中的使用

    前言 在iOS开发中,很多公司对项目的版本控制管理都使用了git,当然也有部分公司使用的是svn.当年我最初接触的是svn,觉得使用起来挺方便的,但是每次切分支都需要下载一份新的代码起来,这实在太麻烦 ...

  6. 教你怎么检测Heartbleed OpenSSL漏洞

    Heartbleed错误是一个严重的漏洞.这个弱点可以窃取信息,在正常情况下,由SSL / TLS加密保护互联网.Heartbleed错误允许任何人在互联网上阅读系统的内存保护脆弱的OpenSSL的软 ...

  7. Android Build Error(1)

    Type 1 —— Build Path Problem : **.jar包文件缺失 1.在Android项目根目录下新建一个libs文件夹: 2.把你需要的导入的第三方Jar包复制进这个目录: 3. ...

  8. MyCat:取代Cobar数据库中间件

    什么是MyCAT?简单的说,MyCAT就是: 一个彻底开源的,面向企业应用开发的“大数据库集群” 支持事务.ACID.可以替代Mysql的加强版数据库 ? 一个可以视为“Mysql”集群的企业级数据库 ...

  9. 简述MVC框架模式以及在你(Android)项目中的应用

    标题是阿里电话面试的问题,一直以为自己很清楚MVC模式,结果被问到时,居然没法将MVC和Android中各个组件对应起来,所以,面试肯定挂了,不过面试也是学习的一种方式,可以知道大公司看中什么,以及自 ...

  10. Symantec Backup Exec 报"Access denied to directory xxx" Error Code E0008488

    使用Symantec Backup Exec将几台Linux服务器上的RMAN备份收带时,偶尔会遇到作业备份失败的情况,检查Job History,就会发现有“Access denied to dir ...