cocos2d-x的Helloworld程序运行流程(win32)
2015-06-06 12:42
537 查看
自学cocos2d难免有错误的理解,作为参考吧
创建好Helloworld工程后,进入VS2012可以看到main主函数:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/30/c51ac6d15196f6651f694ae94d908968)
首先程序从主函数运行,代码如下:
创建完对象后的下一步才是最关键的。
(第二步)调用Application类里的getInstance()方法,这步我看了下源码基本上就是用一个指针指向app对象,然后通过该指针(第三步)调用run()方法。
进入run()方法后
在AppDelegate.cpp中查看applicationDidFinishLaunching()
第一句是创建导演对象以及初始化他,但是这个初始化init()不是Helloworld.cpp里面的init(),可以查看源码
查看auto scene = HelloWorld::createScene();所用方法代码,可以看见
调用create()方法后程序会调用各自的init()方法,
注意:第一次写博客语言表达肯能不太清晰,编写工具运用不太熟悉,谅解。
创建好Helloworld工程后,进入VS2012可以看到main主函数:
首先程序从主函数运行,代码如下:
#include "main.h" #include "AppDelegate.h" #include "cocos2d.h" USING_NS_CC; int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // create the application instance AppDelegate app; //(第一步)创建对象 return Application::getInstance()->run(); }
创建完对象后的下一步才是最关键的。
(第二步)调用Application类里的getInstance()方法,这步我看了下源码基本上就是用一个指针指向app对象,然后通过该指针(第三步)调用run()方法。
进入run()方法后
int Application::run() { PVRFrameEnableControlWindow(false); // Main message loop: LARGE_INTEGER nFreq; LARGE_INTEGER nLast; LARGE_INTEGER nNow; QueryPerformanceFrequency(&nFreq); QueryPerformanceCounter(&nLast); initGLContextAttrs(); // Initialize instance and cocos2d. if (!applicationDidFinishLaunching())//(第四步)从这里进入AppDelegate类中初始化操作 { return 0; } auto director = Director::getInstance(); auto glview = director->getOpenGLView(); // Retain glview to avoid glview being released in the while loop glview->retain(); //(第十五步)游戏循环,如果没有触发停止操作会一直循环 while(!glview->windowShouldClose()) { QueryPerformanceCounter(&nNow); if (nNow.QuadPart - nLast.QuadPart > _animationInterval.QuadPart) { nLast.QuadPart = nNow.QuadPart - (nNow.QuadPart % _animationInterval.QuadPart); director->mainLoop(); glview->pollEvents(); } else { Sleep(1); } } // Director should still do a cleanup if the window was closed manually. if (glview->isOpenGLReady()) { director->end(); director->mainLoop(); director = nullptr; } glview->release(); return true; }
在AppDelegate.cpp中查看applicationDidFinishLaunching()
bool AppDelegate::applicationDidFinishLaunching() { // 初始化导演 auto director = Director::getInstance();//(第五步)进入系统默认的init()初始化 auto glview = director->getOpenGLView();//(第八步)创建OpenGL的对象 if(!glview) { glview = GLViewImpl::create("My Game"); director->setOpenGLView(glview); } // (第九步)设置FPS的显示与否 director->setDisplayStats(true); // (第十步)设置FPS值 director->setAnimationInterval(1.0 / 60); // (第十一步)创建一个背景,这里面有用户自己写的init()方法初始化 auto scene = HelloWorld::createScene(); // 运行 director->runWithScene(scene); return true; }
第一句是创建导演对象以及初始化他,但是这个初始化init()不是Helloworld.cpp里面的init(),可以查看源码
Director* Director::getInstance() { if (!s_SharedDirector) { s_SharedDirector = new (std::nothrow) DisplayLinkDirector(); CCASSERT(s_SharedDirector, "FATAL: Not enough memory"); s_SharedDirector->init();//(第六步)在这里做初始化操作 } return s_SharedDirector; }
查看auto scene = HelloWorld::createScene();所用方法代码,可以看见
Scene* HelloWorld::createScene() { // 'scene' is an autorelease object auto scene = Scene::create(); //(第十二步)这里是调用Scene的init()方法 // 'layer' is an autorelease object auto layer = HelloWorld::create(); //(第十三步)这里是调用了Helloworld的init()方法 //(第十四步)将图层加到背景上 scene->addChild(layer); // return the scene return scene; }
调用create()方法后程序会调用各自的init()方法,
注意:第一次写博客语言表达肯能不太清晰,编写工具运用不太熟悉,谅解。
相关文章推荐
- cocos2dx 3.0 用ClippingNode做游戏的新手引导
- cocos2dx-2.X Layout设置大小问题
- Cocos2d-x3.2 Grid3D网格动作
- cocos2d-x之Ref列表容器(实例:__Array容器)
- SMC --- COCOS2D-X 状态机代码生成工具
- 【深入了解cocos2d-x 3.x】定时器(scheduler)的使用和原理探究(3)
- cocos2d-x-3.xWindows下的环境搭建,包括Android项目的配置
- cocos2d3.5新手引导
- cocos2dx coscostudio 动画连续播放
- 【动作】Cocosd-x3.x 动作类归纳
- 【动作】Cocos2d-x 动作的分类与使用总结
- 大话cocos2d-js(3)
- 【cocos2d-x 027】 android.mk详解
- cocos2dx屏幕常亮设置(转)
- 关于cocos2d js中chrome浏览器无法加载本地文件的问题
- cocos2d-x 3.3 之卡牌设计 NO.4 定时器的使用(清理内存)
- cocos2d-js Mac下的JSB绑定步骤
- cocos2dx中使用JPG图和只带Alpha的PNG图合成渲染
- cocos2d的-X- luaproject的LUA脚本加密
- WP8移植过程遇到的各种坑