理解 Cocos2D 如何绘制帧

浅谈cocos2dx渲染方式 实际上,localZOrderAndArrival在addChild的时候就会生成一个,在前面addChild的时候,生成的会小于后面addChild的。CustomCommand是所有命令中最简单的一个,也是最灵活的一个,绘制的内容和方式完全交由我们自己决定。我们一般globalZOrder都是设置为0,那么设置为0,这里就不会进行排序,那么节点渲染的顺序就是之前加入RenderCommon的顺序,也就是之前对子节点排序的顺序。后续,会判断下一条的指令的ID是否和上一个相同,如果相同,那么就继续放入。 阅读详情

绘制帧是游戏的关键环节, 要做事情有两件

1) 处理游戏对象的状态变化 ( 位置移动, 碰撞等等 )

2) 重新绘制这些对象


绘制对象

本文谈一下我对 Cocos2D 绘制帧实现的理解, 见下图 (  注意, 这不是严格的UML, 只是为了便于理解绘制的 )

drawScene 就是要求 Cocos2D 去绘制一帧, Schudler_update() 就是处理  1) 游戏对象的状态变化 这个我们后面会讨论, 先说

2) 重新绘制这些对象

visit 正是实现上屏的方法




visit的要点有2

a)  visit 是 Node的方法,  Node 是有层次结构的组合模式 ( Composite)

    对于普通Node,  visit直接调用draw 方法 ( 比如 对于 CCSprite 派生类, 会重载 draw ( 而不是重载 visit) , 而其draw的实现就是调用 opengl 函数直接画图

b) 对于 Composite Node

   它的 visit 的实现就是调用它引用到的多个 Nodes (  可以认为这些就是它的孩子  ) 的 visit 方法.


一个 CCScene 就是一个 Composite Node, 而一个 Sprite 就是一个普通 Node, 当调用 CCScene 的 visit方法, 就调用它所有孩子的 visit方法, 并把整个游戏画面给画了出来.


状态更新


对于状态更新, 我们希望有一个 user_function, 因为不同游戏,玩法逻辑不同. 我们要按照自己设想的逻辑去更新对象状态.

回忆一下是如何做到, 参见我写的中的代码

Cocos2d Box2D 开发Android下的 Breakout 撞球游戏


我们 schedule 了一个 tick 去处理游戏逻辑 ( 这个 tick 是让 Box2D engine 运行一下 step, 而后根据Box2D 的状态去更新 CCSprite, 实际就是把状态更新委托的 Box2D, 而最后做一下Box2D Body 和 Sprite 的同步而已)


bool HelloWorld::init()  
{  
   ...
   schedule(schedule_selector(HelloWorld::tick));
}

void HelloWorld::tick(float dt)   
{   
  
    _world->Step(dt, 10, 10);  
    for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) {      
        if (b->GetUserData() != NULL) {  
            CCSprite *ballData = (CCSprite *)b->GetUserData();  
            ballData->setPosition(ccp(b->GetPosition().x * PTM_RATIO,  
            b->GetPosition().y * PTM_RATIO));  
            ballData->setRotation(-1 * CC_RADIANS_TO_DEGREES(b->GetAngle()));  
        }          
    }  
}  


因此我把这个 tick 称为 user_functions, 下边是处理流程

1) 在 init 我们 schedule 了一个 user_function, 其实他调用到了 Sheduler 的方法, 新建了 timer, 并被到一个 hashmap 中

2)  当 CCDirector 的 drawScene 被调用时, 它调用 Sheduler 的 update方法, 并传递到 Timer

3) Timer 的update 被调用时, 它检查是否到设定执行时间. 到, 就执行 user_function, 没有, 就返回, 等待下一次调用.






Cocos2D 的代码很细, 我没有仔细研究, 但机制我觉得大概如此, 还请指正





C语言新手必练:10个实战小项目带你快速上手(附完整代码) 本文为C语言初学者精选10个实战项目,从基础的温度转换器到高级的迷宫求解算法,涵盖输入输出、条件判断、循环控制、数组操作等核心知识点。每个项目配有完整代码和详细解析,帮助新手通过实践掌握编程思维,特别适合刚学完语法但缺乏实战经验的学习者。 阅读详情

相关推荐

Debian 11 之使用hostapd与dnsmasq进行AP设置

本文介绍debian 11 系统下,使用hostapd 和 dnsmasq配置无线热点的方法。

xinghaitao2005的博客 1695

cocos2d-x - Render 渲染

Render 场景图的渲染大致遵循以下几个步骤: Director::mainLoop:每一帧都会执行节点的渲染。void Director::mainLoop() { if (_purgeDirectorInNextLoop) { _purgeDirectorInNextLoop = false; purgeDirector(); } else if (_restartDirectorInNextLoop) { _r

Gosick_Geass_Gate的博客 910

手把手教你解决Ubuntu 20.04虚拟机桥接模式下的网络问题:DHCP与静态IP配置全指南

本文详细解析了Ubuntu 20.04虚拟机在桥接模式下的网络配置问题,包括DHCP与静态IP的配置方法及常见故障排查技巧。通过深入讲解桥接模式原理和提供实战操作指南,帮助用户解决无法访问外网、ping不通等典型网络问题,实现虚拟机与物理网络的无缝连接。

weixin_29256771的博客 541

cocos2dx-3.17渲染流程学习笔记

图形渲染简介

qq_33811591的博客 772

Echocardiography Image Segmentation: A Survey(超声心动图图像分割方法综述--中文翻译)

Echocardiography Image Segmentation: A Survey 摘要:尽管超声图像的获取是较廉价,并且免于辐射的,但是超声图像因为信号衰减、斑点噪声等干扰,使得超声图像的分割具有较大挑战。本文将近些年应用于超声心动图像分割的相关方法进行了分类总结,并列出了10篇具有原创思想的文章,这些文章具有特殊的临床使用价值或是对于超声心动图像分割具有指导意义。 关键词:超声心动...

mrj4124的博客 5097

开源DIY龙门架:从零构建可编程运动控制平台

运动控制是自动化与机器人技术的核心基础,它通过精确指令驱动执行机构,实现物体的定位与轨迹规划。其原理通常涉及控制器、驱动器、电机与传动机构的协同工作,核心价值在于将数字指令转化为精准的物理运动,从而解放人力并提升作业一致性。在工业自动化、桌面制造(如3D打印、激光雕刻)及教育机器人等领域应用广泛。本文聚焦于一个具体的工程实践案例:使用**铝型材**、**3D打印**零件、Arduino控制器及步进电机,从机械结构设计、电路连接到代码编写,手把手教你打造一个模块化、可扩展的开源龙门架系统。该系统不仅成本可控,

weixin_33168937的博客 614

cocos 中每个节点的visit与draw函数

visit函数内会先调用自己的draw函数,然后变量所有子节点递归调用字节的visit: cocos渲染流程是从Director类的主循环mainLoop中开始: 1.调用drawScene(): //精简后的代码,方便理解 void Director::drawScene() { /*此处省略一些代码 ..... */ _renderer->clear(); pushMatrix(MATRIX_STACK_TYPE::MATRIX_ST..

u012861978的专栏 1399

MagicDraw小白必看:BDD图中模块的5种属性详解(含SysML v1.6最新端口配置指南)

本文面向MagicDraw初学者,详细解析SysML BDD图中模块的五种核心结构属性,包括组成部分、引用、值、约束属性及端口。重点阐述了SysML v1.6中端口设计的范式转移,对比了完整端口与代理端口的区别与应用场景,并通过实战案例指导如何利用代理端口进行清晰的接口定义与系统架构设计。

rum55的博客 372

cocos2d-x 渲染流程简要说明

在游戏每帧刷新的情况下调用通过绘制当前场景对场景下的所有节点采用的方式是:先遍历后渲染遍历通过按照LocalZOrder进行排序遍历,并生成不同类型的绘制命令在遍历结束后,对绘制命令按照GlobalZorder进行排序遍历然后对绘制命令会进行合批处理等,然后调用OpenGL开始渲染。这个就是它大概的流程。如果UI不需要显示,可以直接进行隐藏减少节点的嵌套复杂度,有助于提升节点的遍历速度减少全局层级的设置,有助于提升绘制命令的遍历。

鹤九日的博客 3641

Python爬虫实战:5分钟搞定大众点评评论数据抓取(附完整代码)

本文详细介绍了使用Python爬虫高效获取大众点评评论数据的5个关键技巧,包括环境配置、智能页面解析、反反爬策略、数据存储与容错设计以及性能优化。通过实战案例和完整代码,帮助开发者快速掌握文本挖掘技术,适用于市场分析和商业决策。

weixin_30660027的博客 290

MobileViT替换YOLOv11主干网络:轻量化新思路-(用MobileViT等轻量视觉Transformer降低计算成本)

在计算机视觉领域,目标检测一直是核心任务之一,而YOLO(You Only Look Once)系列算法因其出色的速度-精度平衡成为工业界和学术界的热门选择。随着YOLOv11的推出,模型性能达到了新的高度,但其计算复杂度和参数量也随之增加,这对资源受限的移动设备和嵌入式系统提出了挑战。与此同时,视觉Transformer(ViT)的出现为计算机视觉带来了全新范式,但其庞大的计算需求限制了在移动端的应用。MobileViT作为一种创新的轻量级视觉Transformer架构,巧妙结合了CNN的归纳偏置优势和V

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1646

初始化文件理解 Cocos2D 如何绘制帧

在写这篇文章之前,xxx已经写过了几篇关于改初始化文件主题的文章,想要了解的朋友可以去翻一下之前的文章          我们道知Cocos2D 是跨平台的 ( Android, iOS, BlackBerry ), 因此它必须把自己适配到不同平台上, 这些适配包含:     1) 屏幕表现     2) 户用输入     3) 进程主循环     4) 资源文件 (图片,音乐)  ...

weixin_33984032的博客 91

文本分析-使用jieba库进行中文分词和去除停用词(附案例实战)

本文将手把手教会你使用jieba库进行中文分词和去除停用词,这是学会文本分析的必经之路!

m0_64336780的博客 4万+

简单理解Cocos2d-x帧动画

Cocos2d-x的帧动画 由一组图片组成的.1.首先需要一组图片。然后打包成plist文件.    打包成plist文件需要用到TexturePacker工具.    以下是TexturePacker下载地址    点击打开链接    下载完成后安装到你需要的盘里面.首先  点击New Project ,新建一个文件夹.   这个时候它会提醒 试用还是买在这里我是试用6天 ,   特别点:Dat...

黑客小清新mua~ 272

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

cocos2d-x 绘制基本图形

在cocos2dx里绘图需要继承CCNode,然后实现void draw()函数。 绘制基本图形的函数在CCDrawingOrimitives.h里定义,今天好奇心起决定研究一下怎么画图,顺便锻炼一下我那贫乏的英文水平哈哈哈 绘制基本图形的函数有以下这些,都在头文件里,我这边只是按我自己的理解做下翻译,勿笑哈哈哈 /** initialize context */ v

zq5599966_xy的专栏 3515

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

我所理解的Cocos2d-x 全新的绘制系统

新绘制系统的特点 将逻辑绘制从主循环中分离。每个UI元素的类型更多的是根据它在应用程序中的特征而不是绘制方式的不同划分的,也就是说,多个不同类型的UI元素可能拥有相同绘制方式。 采用应用程序级别的视口裁剪。 采用自动批绘制技术。 更简单地实现绘制的自定义。 绘制系统概览绘制流程分为三个阶段: 通过UI树的遍历生成绘制命令。 对绘制命令进行排序。 执行绘制命令。 RenderCommandCocos2

梦幻DUO的游戏开发之路 1349

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

cocos2d-x CCAnimate 动画播放时间帧问题

cocos2d-x CCAnimate 播放动画原理。

840

cocos2d-x实现简单帧动画

下面要讲的方法是cocos2d-x官方的实现方法      CCAnimation* pAnimation = CCAnimation::create(); CC_BREAK_IF(!pAnimation); for (int i = 1; i <= 14; i++) { char szName[100] =

dssdss123的专栏 1356

Cocos2d-x初入学堂(1)-->图形绘制

欢迎转载!转载时请注明出处:http://blog.youkuaiyun.com/aa4790139/article/details/8103608 由于小弟本人一直和游戏有着不解之缘,从小就特喜欢玩游戏,然后读大学,选专业都选了一个游戏专业,唉~  各种贵...不过喜欢没办法。 然后出来是做J2ME的,然后转android游戏开发,尤其是有J2ME的朋友,相信都是从底层绘制开始的。在之前也用An

WNYFK的专栏 1444

cocos2D-X源码分析之从cocos2D-X学习OpenGL(5)---绘制基本图形

最近完整的学习了learnopengl(http://www.learnopengl.com/),觉得非常有启发,从而又想起了这个长草许久的专题,正好趁这段时间,从本篇起完成这个专题,需要说明的是,从本系列的第五篇起将使用cocos2d-x3.10版本对应的代码,最早的三篇采用的是相对比较老的代码,但是我重新阅读后发现对理解有没有什么影响,所以暂时我不会升级之前的代码,但是为了保持和最新代码的一致

手机游戏开发学习笔记 4937

我所理解的Cocos2d-x

我所理解的Cocos2d-x(完全基于Cocos2d-x3.0,深度剖析计算机图形学,OpenGL ES及游戏引擎架构,全面提升游戏开发相关知识) 秦春林 著   ISBN 978-7-121-24625-8 2014年11月出版 定价:79.00元 404页 16开 内容提要 《我所理解的Cocos2d-x》针对最新的 Cocos2d-x3.x版本,介绍了Coco2d-x游戏

博文视点(北京)官方博客 3234

我所理解的Cocos2d-x UI树

UI树的遍历UI树的遍历有两个重要的目的: 遍历的顺序决定了元素被绘制的顺序。 在遍历过程中实现元素的模型视图变换矩阵的计算,其计算结果供OpenGL ES渲染管线计算顶点位置。 逻辑深度在遍历之前,先要对所有子元素按逻辑深度从小到大的顺序进行排序。 使用globalZOrder也有一个限制,那就是不能对SpriteBatchNode的子元素单独设置globalZOrder。因为Sprit

梦幻DUO的游戏开发之路 1272

cocos2d-x棋牌项目-模块1:从 main 到首帧渲染(cocos2d-x 启动链路)

本文基于 chessNcard_game 纸牌项目,结合 cocos2d-x 3.17.2 真实代码,梳理程序从 main、AppDelegate 到 GameScene、GameView 的启动链路,并说明设计分辨率、资源加载、首帧卡牌构建与输入上抛机制,适合作为 cocos2d-x 入门与项目阅读起点。

a1933580388的博客 493

cocos2d-x 菜鸟实习生学习篇(七) 逐帧动画(上)

有段时间没更新博客了,这几天都比较忙,要完成boss布置的一些任务,前些天又请了四天假回校考试跟入党转正。对于实习生来说,一下子请四天假堪称胆大包天!话说入党这事真的很纠结,也不知道自己大一点时候怎么就那么傻要申请入党呢?现在有点后悔了。愤青伤不起。 这篇博客我就不参考其他高手的啦,可以看出自己这阶段确实是有点进步的!不过推荐大家看篇程序员“小说”吧。昨天无意间看到的,有一百多篇,挺喜欢的,觉得

天涯海阁 906

cocos2d-x节点(cocos2d.h)API

本文来自http://blog.youkuaiyun.com/runaying ,引用必须注明出处! cocos2d-x节点(cocos2d.h)API 温馨提醒:为了大家能更好学习,强烈推荐大家看看本人的这篇博客 Cocos2d-X权威指南笔记 cocosd 所包含的类文件 /////cocos2d-x-3.0alpha0/cocos2dx/include //cocos

runaying的专栏 1872

Cocos2d-lua的运行理解

关键词: cocos2d-lua项目启动流程 lua调用cocos2d引擎API 这里是个小测试 环境 引擎版本:Cocos2d-x 3.10 开发工具:Xcode8.1 简述 所谓的Cocos2d-lua,其实只是Cocos2d引擎添加了Lua绑定的版本。 从创建命令可以看出来 cocos new TestProj -d Desktop/

5821
上一篇: 粉丝是最好的宣传渠道
下一篇: Cocos2D 如何做 Android 适配
span76
博客等级 码龄18年 117粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值