Cocos2d-x学习(二十一):cocos2d-x引擎结构

2024-06-17 11:08

本文主要是介绍Cocos2d-x学习(二十一):cocos2d-x引擎结构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Cocos2d-x学习(二十一):cocos2d-x引擎结构       

        分类:            Cocos2d-X学习 3256人阅读 评论(0) 收藏 举报

目录(?)[+]

  1. 程序入口
    1. 1在_tWinMain中创建的AppDelegate类的对象
    2. 2随后程序就完全交给了cocos2d-x引擎去处理
  2. 程序主循环
    1. 1初始化CCEGLView在不同平台下CCEGLView是不同的
    2. 2游戏引擎的主循环
      1. a 通过引用计数实现对内存的管理
      2. b 游戏内元素的渲染
  3. 渲染
    1. 1矩阵变化
    2. 2绘制

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


1.程序入口

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

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

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

代码如下:

[cpp] view plain copy print ?
  1. <span style="font-size: 14px;">int APIENTRY _tWinMain(HINSTANCE hInstance, 
  2.                        HINSTANCE hPrevInstance, 
  3.                        LPTSTR    lpCmdLine, 
  4.                        int       nCmdShow) 
  5.     UNREFERENCED_PARAMETER(hPrevInstance); 
  6.     UNREFERENCED_PARAMETER(lpCmdLine); 
  7.  
  8.     // create the application instance 
  9.     AppDelegate app; 
  10.  
  11.     return cocos2d::CCApplication::sharedApplication().run(); 
  12. }</span> 
int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR    lpCmdLine,int       nCmdShow)
{UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);// create the application instanceAppDelegate 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. 游戏内元素的渲染

[cpp] view plain copy print ?
  1. <span style="font-size: 14px;">void CCDisplayLinkDirector::mainLoop(void
  2.     if (m_bPurgeDirecotorInNextLoop) 
  3.     { 
  4.         purgeDirector(); 
  5.         m_bPurgeDirecotorInNextLoop = false
  6.     } 
  7.     else if (! m_bInvalid) 
  8.     { 
  9.         drawScene(); 
  10.       
  11.         // release the objects 
  12.         CCPoolManager::getInstance()->pop();      
  13.     } 
  14. }</span> 
void CCDisplayLinkDirector::mainLoop(void)
{if (m_bPurgeDirecotorInNextLoop){purgeDirector();m_bPurgeDirecotorInNextLoop = false;}else if (! m_bInvalid){drawScene();// release the objectsCCPoolManager::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为正值的子节点

[cpp] view plain copy print ?
  1. <span style="font-size: 14px;">if(m_pChildren && m_pChildren->count() > 0) 
  2.         // draw children zOrder < 0 
  3.         ccArray *arrayData = m_pChildren->data; 
  4.         for( ; i < arrayData->num; i++ ) 
  5.         { 
  6.             pNode = (CCNode*) arrayData->arr[i]; 
  7.  
  8.             if ( pNode && pNode->m_nZOrder < 0 )  
  9.             { 
  10.                 pNode->visit(); 
  11.             } 
  12.             else 
  13.             { 
  14.                 break
  15.             } 
  16.         } 
  17.     } 
  18.  
  19.     // self draw 
  20.     this->draw(); 
  21.  
  22.     // draw children zOrder >= 0 
  23.     if (m_pChildren && m_pChildren->count() > 0) 
  24.     { 
  25.         ccArray *arrayData = m_pChildren->data; 
  26.         for( ; i < arrayData->num; i++ ) 
  27.         { 
  28.             pNode = (CCNode*) arrayData->arr[i]; 
  29.             if (pNode) 
  30.             { 
  31.                 pNode->visit(); 
  32.             } 
  33.         }        
  34.     }</span> 

这篇关于Cocos2d-x学习(二十一):cocos2d-x引擎结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1069273

相关文章

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]