Cocos2d-x学习(二十一):cocos2d-x引擎结构
2013-01-11 01:16
423 查看
在不同平台下,cocos2d-x的入口是不一样的,在win32平台,程序是从_tWinMain()开始的,可以在每一个cocos2d-x的程序中的main.cpp中找到。
(PS: AppDelegate继承于CCApplication,在构造方法中,初始化CCApplication单例类的唯一实例)
代码如下:
[cpp] view
plaincopy
<span style="font-size:14px;">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();
}</span>
(PS:cocos2d-x中有很多这样的用法,即同一个头文件,在不同平台上实现不同)
win32平台下的CCEGLView是一个windows窗口,具体情况CCEGLView::Create()
(PS:CCEGLView还用来处理鼠标点击模拟器触摸,按键等事件的处理,如果要自定义,请参看CCEGLView::WindowProc(),这个函数是Windows程序接收消息回调)
在完成CCEGLView初始化之后,将开启游戏渲染的主循环,即调用CCDirector::sharedDirector()->mainLoop()。这样,程序就又交给CCDirector类来处理,CCDirector主要处理两件事情:
[cpp] view
plaincopy
<span style="font-size:14px;">void CCDisplayLinkDirector::mainLoop(void)
{
if (m_bPurgeDirecotorInNextLoop)
{
purgeDirector();
m_bPurgeDirecotorInNextLoop = false;
}
else if (! m_bInvalid)
{
drawScene();
// release the objects
CCPoolManager::getInstance()->pop();
}
}</span>
在cocos2d中渲染的根节点是CCScene(PS:CCScene也是CCNode的子类),但是在drawScene()中似乎没有类似draw()的方法,那是因为在渲染之前,要对游戏中的节点做一些处理,包括旋转,缩放等等,所以这个方法的名字叫visit(),而visit()是定义在CCNode中的虚方法,CCScene中并没有单独实现。
(PS:在每一次渲染的时候,都需要先将之前的矩阵入栈,在渲染完当前节点之后,矩阵出栈,恢复之前的矩阵)
通过CCNode::transform()对当前节点做矩阵处理(包括旋转,缩放等等)
绘制就很简单了,遍历所有的子节点,采用递归的方式,对每一个CCNode调用visit()方法
(PS:设置Z-Order的时候可以设置为负值,有时候是很必要的,比如我们以一个人物精灵的身体为位置参照物,绘制在Z-Order为0的位置上,如果要给这个人物精灵添加一个披风耍帅,就可以将披风的Z-Order设置为负值,并且可以继续以精灵身体作为参照物,因为cocos2d-x提供的访问顺序也是 Z-Order为负值的子节点->自身节点->Z-Order为正值的子节点)
[cpp] view
plaincopy
<span style="font-size:14px;">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();
}
}
}</span>
1.程序入口
(1)在_tWinMain()中,创建的AppDelegate类的对象
(PS: AppDelegate继承于CCApplication,在构造方法中,初始化CCApplication单例类的唯一实例)
(2)随后,程序就完全交给了cocos2d-x引擎去处理
代码如下:[cpp] view
plaincopy
<span style="font-size:14px;">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();
}</span>
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. 游戏内元素的渲染
[cpp] viewplaincopy
<span style="font-size:14px;">void CCDisplayLinkDirector::mainLoop(void)
{
if (m_bPurgeDirecotorInNextLoop)
{
purgeDirector();
m_bPurgeDirecotorInNextLoop = false;
}
else if (! m_bInvalid)
{
drawScene();
// release the objects
CCPoolManager::getInstance()->pop();
}
}</span>
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为正值的子节点)
[cpp] view
plaincopy
<span style="font-size:14px;">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();
}
}
}</span>
相关文章推荐
- Cocos2d-x学习(二十一):cocos2d-x引擎结构
- Cocos2d-x学习(二十一):cocos2d-x引擎结构
- 游戏开发记录120811:cocos2d-x引擎学习---目录结构及主要类
- cocos2d游戏引擎学习笔记(初识框架结构和内存规划)
- (转载)cocos2d-X学习之引擎源码目录结构介绍
- cocos2d-X学习之引擎源码目录结构介绍
- cocos2d-X学习之引擎源码目录结构介绍
- cocos2d-x学习之旅(八): 2.1 cocos2d-x 引擎目录结构
- cocos2d-x入门学习笔记,主要介绍cocos2d-x的基本结构,并且介绍引擎自带的示例
- Cocos2d-X引擎学习分享
- 【Cocos2d-html5游戏引擎学习笔记(12)】Schedule定时器
- Cocos2d-x 3.x 引擎目录结构
- [Quick-Cococs2DX] Quick-Cocos2D-X学习 (二) Quick-Cocos2d-X 核心framework 目录结构与功能介绍
- cocos2d学习笔记(八)物理引擎box2d之二
- Cocos2d-x 3.1.1 学习日志13--物理引擎登峰造极之路
- cocos2d-x 学习点滴(4) cocos2d-x 架构和引擎目录
- 【Cocos2d-html5游戏引擎学习笔记(8)】音乐及音效
- Cocos2d-x学习笔记(一)-------->环境搭建与引擎概况
- quick-cocos2d-x游戏开发【1】——引擎结构总览和创建项目
- Cocos2d-X引擎学习分享