第一个工程HelloWorld创建和分析
首先用命令行创建一个cocos2dx程序。
cocos new 工程名 -p 包名 -l 语言 -d 文件位置.如果在D盘创建helloworld的例子即为cocos new HelloWorld -p 包名 -l cpp -d D:\
这样会在D盘根目录下创建一个名为HelloWrold的文件夹。

可以清楚的看到一个cocos项目创建过程,复制cocos2d-x的文件到指定目录,将工程名,包名改为指定的名称。
打开D:\HelloWorld\proj.win32\HelloWorld.sln进入vs,下面进入今天的正题,分析第一个程序,我也是新手,很多地方只能说自己的见解,但整体的流程应该也能说通,希望大家帮我改正。
首先来看工程结构

从名称来看Helloworld工程是主要工程,其他三个libbox2d、libcocos2d、libSpine这三个都是cocos2d需要的类库。
我们只说Helloworld.一个程序入口肯定是main函数,在win32文件夹下有main.h、main.cpp,main.h中申明了main.cpp中需要的头文件。
main.cpp
UNREFERENCED_PARAMETER(hPrevInstance); //没有使用的hPrevInstance变量不报warning UNREFERENCED_PARAMETER(lpCmdLine); //同上 // create the application instance AppDelegate app; //申明一个AppDelegate对象(继承自Application类,调用Application的构造函数) return Application::getInstance()->run(); //运行run方法
Application类在libcocos2d工程->platform->win32->CCApplication-win32.cpp中
Application中的getInstance()方法
Application * Application::sm_pSharedApplication = 0;
//Application的构造函数,实际上是为了初始化sm_pSharedApplication
Application::Application()
: _instance(nullptr)
, _accelTable(nullptr)
{
_instance = GetModuleHandle(nullptr);
_animationInterval.QuadPart = 0;
CC_ASSERT(! sm_pSharedApplication);
sm_pSharedApplication = this;
}
Application* Application::getInstance() { CC_ASSERT(sm_pSharedApplication); //断言sm_pSharedApplication不为空 return sm_pSharedApplication; //返回sm_pSharedApplication }
主函数中调用了Application中的run()方法,不是每一句都能懂,但是大概知道是干啥的,最主要的一句
// Initialize instance and cocos2d. //这句跳转到AppDelegate类中 if (!applicationDidFinishLaunching()) { return 0; }
通过调用applicationDidFinishLaunching()方法(在AppDelegate类中重写),Appdelegate的applicationDidFinishLaunching()如下:
bool AppDelegate::applicationDidFinishLaunching() { // initialize director auto director = Director::getInstance(); auto glview = director->getOpenGLView(); if(!glview) { //窗口名称 glview = GLViewImpl::create("My Game"); director->setOpenGLView(glview); } // turn on display FPS director->setDisplayStats(true); // set FPS. the default value is 1.0/60 if you don't call this director->setAnimationInterval(1.0 / 60); // create a scene. it's an autorelease object //创建HelloWorld场景(最主要的一句话,也可以自己声明别的场景创建。) auto scene = HelloWorld::createScene(); // run运行 director->runWithScene(scene); return true; }
上面讲到创建HelloWorld场景,下面详细说下HelloWorld的创建
Scene* HelloWorld::createScene() { // 'scene' is an autorelease object //调用Scene的create方法创建一个场景 auto scene = Scene::create(); // 'layer' is an autorelease object //调用HelloWorld的create方法创建一个层 auto layer = HelloWorld::create(); // add layer as a child to scene //将层加入到场景中 scene->addChild(layer); // return the scene //将场景返回 return scene; }
最后来说说HelloWorld中create方法,在HelloWorld.cpp中有一个CREATE_FUNC(HelloWorld);的调用。这个宏的定义在CCPlatformMacros.h文件中如下
#define CREATE_FUNC(__TYPE__) \ static __TYPE__* create() \ { \ __TYPE__ *pRet = new(std::nothrow) __TYPE__(); \ if (pRet && pRet->init()) \ { \ pRet->autorelease(); \ return pRet; \ } \ else \ { \ delete pRet; \ pRet = NULL; \ return NULL; \ } \ }
调用时创建HelloWorld类并且调用init方法。
总结为Application->getInstance()->run()->(子类AppDelegate)applicationDidFinishLaunching()->HelloWorld::createScene->调用Scene::create和HelloWorld::create(一个宏定义)->将图层加入到场景中,显示到屏幕上。
至此第一个项目已经有了较为理解的分析,因为是刚学习cocos2dx,其中有很多部分还有不完善的甚至是错的,希望大家指出,以后更深入的学习后我也会改正的。

浙公网安备 33010602011771号