cocos2d-x引擎结构

       忙了一年,用cocos2dx写一款MMO手游,上线已有几月,由于各方面的原因不算成功,cocos2dx感觉只停留在会用的层面上,最近项目比较闲,打算好好学习学习,看看cocos2dx的源码,翻翻别人的博客,发现有帮助的BLOG,贴之,很少会有原创帖。

        

//从引擎结构开始吧,原文地址 http://blog.csdn.net/onerain88/article/details/8271767

在不同平台下,cocos2d-x的入口是不一样的,在win32平台,程序是从_tWinMain()开始的,可以在每一个cocos2d-x的程序中的main.cpp中找到。


1.程序入口

(1)在_tWinMain()中,创建的AppDelegate类的对象

PS: AppDelegate继承于CCApplication,在构造方法中,初始化CCApplication单例类的唯一实例

(2)随后,程序就完全交给了cocos2d-x引擎去处理

代码如下:

int APIENTRY _tWinMain(HINSTANCE hInstance,  
                       HINSTANCE hPrevInstance,  
                       LPTSTR    lpCmdLine,  
                       int       nCmdShow)  
{  
    UNREFERENCED_PARAMETER(hPrevInstance);  
    UNREFERENCED_PARAMETER(lpCmdLine);  
  
    // create the application instance  
    AppDelegate app;  
  
    return cocos2d::CCApplication::sharedApplication().run();  
}

2.程序主循环

(1)初始化CCEGLView,在不同平台下,CCEGLView是不同的

PS:cocos2d-x中有很多这样的用法,即同一个头文件,在不同平台上实现不同

win32平台下的CCEGLView是一个windows窗口,具体情况CCEGLView::Create()

PS:CCEGLView还用来处理鼠标点击模拟器触摸,按键等事件的处理,如果要自定义,请参看CCEGLView::WindowProc(),这个函数是Windows程序接收消息回调

(2)游戏引擎的主循环

在完成CCEGLView初始化之后,将开启游戏渲染的主循环,即调用CCDirector::sharedDirector()->mainLoop()。这样,程序就又交给CCDirector类来处理,CCDirector主要处理两件事情:

a. 通过引用计数实现对内存的管理

b. 游戏内元素的渲染

void CCDisplayLinkDirector::mainLoop(void)  
{  
    if (m_bPurgeDirecotorInNextLoop)  
    {  
        purgeDirector();  
        m_bPurgeDirecotorInNextLoop = false;  
    }  
    else if (! m_bInvalid)  
    {  
        drawScene();  
       
        // release the objects  
        CCPoolManager::getInstance()->pop();       
    }  
}

3.渲染

在cocos2d中渲染的根节点是CCScene(PS:CCScene也是CCNode的子类),但是在drawScene()中似乎没有类似draw()的方法,那是因为在渲染之前,要对游戏中的节点做一些处理,包括旋转,缩放等等,所以这个方法的名字叫visit(),而visit()是定义在CCNode中的虚方法,CCScene中并没有单独实现。

PS:在每一次渲染的时候,都需要先将之前的矩阵入栈,在渲染完当前节点之后,矩阵出栈,恢复之前的矩阵

(1)矩阵变化

通过CCNode::transform()对当前节点做矩阵处理(包括旋转,缩放等等)

(2)绘制

绘制就很简单了,遍历所有的子节点,采用递归的方式,对每一个CCNode调用visit()方法

PS:设置Z-Order的时候可以设置为负值,有时候是很必要的,比如我们以一个人物精灵的身体为位置参照物,绘制在Z-Order为0的位置上,如果要给这个人物精灵添加一个披风耍帅,就可以将披风的Z-Order设置为负值,并且可以继续以精灵身体作为参照物,因为cocos2d-x提供的访问顺序也是 Z-Order为负值的子节点->自身节点->Z-Order为正值的子节点

if(m_pChildren && m_pChildren->count() > 0)  
{  
        // draw children zOrder < 0  
        ccArray *arrayData = m_pChildren->data;  
        for( ; i < arrayData->num; i++ )  
        {  
            pNode = (CCNode*) arrayData->arr[i];  
  
            if ( pNode && pNode->m_nZOrder < 0 )   
            {  
                pNode->visit();  
            }  
            else  
            {  
                break;  
            }  
        }  
    }  
  
    // self draw  
    this->draw();  
  
    // draw children zOrder >= 0  
    if (m_pChildren && m_pChildren->count() > 0)  
    {  
        ccArray *arrayData = m_pChildren->data;  
        for( ; i < arrayData->num; i++ )  
        {  
            pNode = (CCNode*) arrayData->arr[i];  
            if (pNode)  
            {  
                pNode->visit();  
            }  
        }         
    }
原文地址 http://blog.csdn.net/onerain88/article/details/8271767

转载于:https://my.oschina.net/u/211101/blog/124451

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值