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

相关文章

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

Python利用PySpark和Kafka实现流处理引擎构建指南

《Python利用PySpark和Kafka实现流处理引擎构建指南》本文将深入解剖基于Python的实时处理黄金组合:Kafka(分布式消息队列)与PySpark(分布式计算引擎)的化学反应,并构建一... 目录引言:数据洪流时代的生存法则第一章 Kafka:数据世界的中央神经系统消息引擎核心设计哲学高吞吐

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

SpringBoot利用树形结构优化查询速度

《SpringBoot利用树形结构优化查询速度》这篇文章主要为大家详细介绍了SpringBoot利用树形结构优化查询速度,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一个真实的性能灾难传统方案为什么这么慢N+1查询灾难性能测试数据对比核心解决方案:一次查询 + O(n)算法解决

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2