今天开始学习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. ICSharpCode.SharpZipLib简单使用

    胡乱做了个小例子,记录下来,以便后面复习. using System; using System.Collections.Generic; using System.Linq; using Syste ...

  2. Android之Splash页面

    在继上个任务没有解决之后,心灰意冷之后,现在的我在跟着视频学习开发一个手机卫士的软件.在写自己的笔记之前,我先来展示一下我的结果. 下面我来总结一下我跟随视频学习到的知识点: 一.代码的组织结构: 1 ...

  3. tomcat WEB-INF中的结构

    tomcat中 WEB-INF中结构包含3个东西:web.xml,classes文件夹,lib文件夹 web.xml用来配置web中服务调用的uri和对应服务指定的是哪个class文件 classes ...

  4. 关于android的一些基础知识

    怕自己以后忘了,所以在这里先写写! equal和==的区别是,一个用于判断字符串,一个用于判断int是否相等 equal比较的是对象,==比较的是值

  5. objective-c系列-NSString

    C中没有字符串变量的概念 只有一个字符串常量的概念 即:   “abcd” 在c中,用一个字符串指来指向一个内存地址, 然后从该地址往后,遇到'\0'结束,这一段 内存就表述为一个字符串 char * ...

  6. vs 只能没有智能提示的解决方法

    我vs今天出现一点比较诡异的情况,莫名奇妙就不能自动生成我拖的控件的后端代码了(****.aspx.designer.cs) 我在网上找了下,找到一个解决方法,这里把解决方法贴下来. 网上解决方法的出 ...

  7. JavaScript Patterns 6.2 Expected Outcome When Using Classical Inheritance

    // the parent constructor function Parent(name) { this.name = name || 'Adam'; } // adding functional ...

  8. 理解JavaScript中的原型继承(2)

    两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...

  9. pentaho cde 封装自定义图形控件,动态传参

    在实际项目中经常会用到将经常用到的图形表格组成一个控件,其他地方直接调用,类似于服务器开发的接口,而现在就需要将一些常用的图形做封装,这样就不必重复多次创建相同的内容. 下面就简单的定义一个自定义柱形 ...

  10. mysql服务性能优化—my.cnf配置说明详解

    MYSQL服务器my.cnf配置文档详解硬件:内存16G [client]port = 3306socket = /data/3306/mysql.sock [mysql]no-auto-rehash ...