今天开始学习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. 在Ubuntu上安装Hadoop(单机模式)步骤

    1. 安装jdk:sudo apt-get install openjdk-6-jdk 2. 配置ssh:安装ssh:apt-get install openssh-server 为运行hadoop的 ...

  2. SQL for SQLite

    语法 verb + subject + predicate commannds(命令) SQL由命令组成,以分号为结束.命令有token组成,token由white space分隔,包括空格.tab. ...

  3. Android自定义控件2--优酷菜单界面初始化

    本文开始将逐步去实现下面优酷菜单的效果: 本文地址:http://www.cnblogs.com/wuyudong/p/5912538.html,转载请注明源地址. 本文首先来实现优酷菜单界面初始化工 ...

  4. iOS 检查更新

    注意:苹果官方是不允许app具有检查更新提示! //直接跳转到AppStore - (void)setUpAppUpdate {    [ServerData queryGetURL:@{@" ...

  5. AES加密解密

    AES简介 美国国家标准技术研究所在2001年发布了高级加密标准(AES).AES是一个对称分组密码算法,旨在取代DES成为广泛使用的标准. 根据使用的密码长度,AES最常见的有3种密钥方案,用以适应 ...

  6. 【代码笔记】iOS-书架页面

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...

  7. IOS 如何隐藏tabbar

    系统自带的UITabBarController有时候到不到要求,需要自定义样式. 有一种方法就是在TabBar上面在放一层自己的,正好把原来的遮住. 那么,从Tab进入子的Controller想要隐藏 ...

  8. SQL Server 分区表补充说明

    分区教程参阅:http://database.9sssd.com/mssql/art/951 切换分区(归档):http://technet.microsoft.com/zh-cn/library/m ...

  9. HTML5设计网页动态条幅广告(Banner) 已经加上完整源代码

    横幅广告(Banner): 1.横幅广告是网络广告的常见形式,一般位于网页的醒目位置上:当用户单击这些横幅广告时,通常可以链接到相应的广告页面: 2.设计横幅广告时,要力求简单明了,能够体现出主要的中 ...

  10. 17、文案人员 - IT软件人员书籍系列文章

    这里说的文案人员是软件项目中的一个角色.其主要负责相关文档的整理,用户使用说明书的编写等等,在项目中是一个辅助的角色. 文案人员所做的事情不错,但是她能够辅助软件配置管理工程师进行工作,更好的为维护文 ...