第一个工程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,其中有很多部分还有不完善的甚至是错的,希望大家指出,以后更深入的学习后我也会改正的。

 

posted @ 2015-04-18 20:59  将军/mg  阅读(157)  评论(0)    收藏  举报