游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3976|回复: 2

Cocos2d-x学习笔记(一)HelloCpp框架分析

[复制链接]

1

主题

1

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2013-8-30 15:33:46 | 显示全部楼层 |阅读模式
1】首先分析HelloCpp项目的文件结构,分为Classeswin32、外部文件依赖三个文件夹,其中外部依赖文件夹暂且不用理会。

Classes主要包含像导演、场景、布景、摄像机、精灵、App相关类的申明和定义;
Win32主要是应用程序框架的WinMain函数入口(包括窗口尺寸、标题等参数的一些设置);

2】程序的来龙去脉

WinMain函数分析:

其实此处的WinMain函数自动的参数与Windows里面的WinMain函数非常类似,其中
setViewName("HelloCpp")和setFrameSize(2048, 1536)用于设置应用程序标题及尺寸,setFrameZoomFactor(0.4f)用于设置帧率。那么main函数是怎样与导演类、场景类联系的呢?

这里有一个CCApplication,很容易理解是应用程序类,类似于windows里面的CWinApp类(记得不是很清楚,应该是这个吧),跟踪sharedApplication()函数,此函数返回一个CCApplication*类型,再执行run()函数,这里贴上函数代码:
int CCApplication::run()
{
………………………………
   
    if(!applicationDidFinishLaunching())
    {
        return 0;
    }


…………………………

    while (1)
    {
        if (!PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            // Getcurrent time tick.
            QueryPerformanceCounter(&nNow);

            // Ifit's the time to draw next frame, draw it, else sleep a while.
            if(nNow.QuadPart - nLast.QuadPart > m_nAnimationInterval.QuadPart)
            {
               nLast.QuadPart = nNow.QuadPart;
               CCDirector::sharedDirector()->mainLoop();
            }
            else
            {
                Sleep(0);
            }
            continue;
        }

        if(WM_QUIT == msg.message)
        {
            // Quitmessage loop.
            break;
        }

        // Deal withwindows message.
        if (!m_hAccelTable || ! TranslateAccelerator(msg.hwnd, m_hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}

透过applicationDidFinishLaunching()的定义,我们可以看到这是一个虚函数,源程序中有这样一段代码:
class  AppDelegate : private cocos2d::CCApplication
且此函数在子类中被重写,我们可以调到函数的定义处:(附上部分代码)
bool AppDelegate::applicationDidFinishLaunching() {

// initializedirector
CCDirector* pDirector =CCDirector::sharedDirector();

此处的sharedDirector()函数时一个静态成员函数,返回一个CCDirector*类型的值,这不禁让我们联想起单例模板,每次返回的都是同一个实例。
在函数的返回处有这样两句代码:
    CCScene *pScene = HelloWorld::scene();

    // run
    pDirector->runWithScene(pScene);
其中scene()函数很关键,调到此函数定义:(见注释)
CCScene*HelloWorld::scene()
{
    // 'scene' is anautorelease object
    CCScene *scene = CCScene::create();  //创建场景对象,且自动回收内存
  
    // 'layer' is anautorelease object
    HelloWorld *layer = HelloWorld::create();//创建图层(布景层)对象,且自动回收内存

    // add layer as achild to scene
    scene->addChild(layer);         //在场景中加入图层  

    // return thescene
    returnscene;
}

这里有一个很有意思的事情,我们透过HelloWorld类不能找到create()函数的申明,里面巧妙的使用了宏定义:CREATE_FUNC(HelloWorld);
#define CREATE_FUNC(__TYPE__) \
static __TYPE__* create() \
{\
    __TYPE__ *pRet = new__TYPE__(); \
    if (pRet&& pRet->init()) \
    { \
        pRet->autorelease(); \
        returnpRet; \
    } \
    else \
    { \
        deletepRet; \
        pRet = NULL; \
        returnNULL; \
    } \
}
由此我们可以看出其实create()函数是用宏来替代申明的,并且其内部调用了init()函数用于对图层(布景层)进行一些初始化工作。

【4】关于init()函数
对于里面的代码,学过其他库(例如MFC)很容易看懂里面的代码,主要是向图层里面添加菜单按钮、标签、精灵等等,以及一些尺寸、位置的设置,这里不再啰嗦了。

心得:刚开始研究这个引擎,看到HelloCpp这个示例程序,十分想弄清楚里面的来龙去脉,所以在网上找了很多相关资料,整合之后作为一个笔记以后留着,有错误之处请大家批评指正(写得有点乱)。

1

主题

6

帖子

34

积分

注册会员

Rank: 2

积分
34
QQ
发表于 2014-7-7 15:02:48 | 显示全部楼层
学习,留爪!

1

主题

52

帖子

370

积分

中级会员

Rank: 3Rank: 3

积分
370
QQ
发表于 2014-7-8 09:55:20 | 显示全部楼层
学习,学习,学习,
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-26 02:28

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表