瘸腿蛤蟆笔记37-cocos2d-x-3.2 Box2dTestBed架构详解

瘸腿蛤蟆原创笔记,欢迎转载,转载请标明出处:

上篇回顾

本篇名言:凡是内心能够想到、相信的,都是可以达到的。 [Napoleon Hill]

在最早的时候,蛤蟆学习过cocos2d-x示例架构。这次在这个基础上,蛤蟆要学习Box2dTestBed这个物理引擎的DEMO架构。这样大家可以自己深入研究之了。

架构详解

第一步基本类介绍

首先从我们点到controller.cpp文件中。找到第43行如下:

{ "Box2d - TestBed", []() {
return
new Box2dTestBedScene(); } },

通过这行,我们跟踪 Box2dTestBedScene到
Box2dView.h头文件中。这个文件是在

\cocos2d-x-3.2\tests\cpp-tests\Classes\Box2DTestBed\目录中的。

该头文件中,定义了3个类,1个结构体,1个结构体。

三个类是:

Box2dTestBedScene: 这个类继承于TestScene类,这个类大家可以看蛤蟆之前的cpptests框架的笔记,不过这个我们现在不用去管它,主要记住是继承于CCScene类的即可,不会对我们理解有任何影响。这个类只有一个runThisTest()函数。

MenuLayer:

这个类也继承于Layer,定义了事件监听变量,定义了restartCallback,nextCallback,nextCallback这3个函数用于实现Box2d测试用例的切换。不过我们主要理解函数menuWithEntryID和initWithEntryID。menuWithEntryID这个函数会调用initWithEntryID,并返回MenuLayer类指针。而initWithEntryID函数用来初始化Layer,添加菜单图片,注册菜单等事件,最后调用Box2DView。

Box2DView: 这个类继承于Layer类。定义并实现了触摸函数,按键函数。还定义了一个变量CustomCommand,该类继承于RenderCommand,来自文件\cocos2d-x-3.2\cocos\renderer。是源码自带的,该类的主要作用是
渲染物理(正如它的类名字,在此先不过多展开,展开多了就收不回来了哈)。此外就是其初始化函数了initWithEntryID 和
viewWithEntryID 。viewWithEntryID 调用initWithEntryID 并返回Box2DView 类指针。initWithEntryID实现 初始化Layer层,定义了监听函数,注册监听函数,不过最主要的还是调用Box2dTestBed中的具体用例,例如RayCast::Create。

OK,接着我们讲下那个结构体和类:TestEntry; 这个结构体定义在Test.h文件中,如下:

struct
TestEntry

{

const
char*name;

TestCreateFcn *createFcn;

};这个结构体很明显一个是测试用例的名字,另一个是一个类指针,指向test类。Test类也定义在Test.h文件中。         这个是Box2DView测试用例的基类。我们来看下这个test类。

Test类

这个类是所有测试用例的基类,继承于b2ContactListener类,这个类由源码实现,主要是用于实现后获取碰撞信息。由4个虚函数组成,virtual
voidBeginContact(b2Contact*
contact),virtual
voidEndContact(b2Contact*
contact),virtual
voidPreSolve(b2Contact*
contact,
const b2Manifold*
oldManifold),virtual
void PostSolve(b2Contact*
contact,
const b2ContactImpulse*
impulse)。

Test类中继承了这个4个虚函数,但是本身并没有去全部实现它(只实现了PreSolve 函数)其他的通过具体的测试示例来实现的。此外test类还定义了几个虚函数,需要具体的测试示例自己实现它。其他的函数和变量时所有测试示例都通用的类。这个Test的构造函数,会创建一个物理的世界。析构函数会摧毁这个物理的世界。

第二步调用步骤

OK,接下去我们梳理下整体的调用步骤如下:

首先从controller.cpp文件中的第43行

{ "Box2d - TestBed", []() {
return
new Box2dTestBedScene(); } },

跳跃到Box2dTestBedScene类(这个类在Box2dView.h文件中),该类只有一个函数runThisTest();

函数如下:


void
Box2dTestBedScene::runThisTest()

{

addChild(MenuLayer::menuWithEntryID(0));

Director::getInstance()->replaceScene(this);

}

这个函数会调用MenuLayer::menuWithEntryID() ,创建一个MenuLayer类,并初始化它。

在MenuLayer::menuWithEntryID 函数中,还会调用initWithEntryID 函数。

函数如下:


MenuLayer*
MenuLayer::menuWithEntryID(int
entryId)

{

auto layer =
new
MenuLayer();

layer->initWithEntryID(entryId);

layer->autorelease();

return layer;

}

initWithEntryID 函数会创建Box2dView类。函数如下:


bool
MenuLayer::initWithEntryID(int
entryId)

{

auto director =
Director::getInstance();

Vec2 visibleOrigin = director->getVisibleOrigin();

Size visibleSize = director->getVisibleSize();

m_entryID = entryId;

Box2DView* view =
Box2DView::viewWithEntryID(
entryId );

addChild(view, 0,
kTagBox2DNode);

………………….//此处省略

return
true;

}

创建Box2DView这个类的时候,首先是运行Box2DView::viewWithEntryID ,该函数调用initWithEntryID 函数。如下图


Box2DView*
Box2DView::viewWithEntryID(int
entryId)

{

Box2DView* pView =
new
Box2DView();

pView->initWithEntryID(entryId);

pView->autorelease();

return pView;

}

在initWithEntryID

中最终指向具体的测试类,如RayCast类。


bool
Box2DView::initWithEntryID(int
entryId)

{

m_entry = g_testEntries +
entryId;

m_test = m_entry->createFcn();//就是此处实现跳转

…..

return
true;

}

总结

OK,终于完成了。洗洗睡去了。

时间: 2024-12-23 07:30:15

瘸腿蛤蟆笔记37-cocos2d-x-3.2 Box2dTestBed架构详解的相关文章

瘸腿蛤蟆笔记34-cocos2d-x-3.2 Box2d物理引擎World类介绍

上篇回顾 本篇名言:将爱的能量传送给别人,我们自己就会变成一条管道,吸纳来自上天的神圣能源.而那种玄秘体验是我们每个人都得以品尝的! [詹姆士·雷德非] 上篇中,我们学习了Box2d物理引擎dynamics模块中的Contact类,该类包含所有的接触类型.物体碰撞的具体都在该类中. 蛤蟆接着学习dynamics模块中的类,这次咱们学习World这个类. 理论介绍 World类(其实是b2World类,蛤蟆之前说过,Box2d中的类都是b2开头的)包含Body和Joint. 它管理所有的仿真允许异

瘸腿蛤蟆笔记28-cocos2d-x-3.2 Box2d物理引擎collision模块介绍

上篇回顾 本篇名言:绝不测量山的高度─除非你已到达顶峰,那时你就会知道山有多低. [哈马绍] 上篇中,我们学习了Box2d物理引擎的三大模块之一的common模块,该模块主要包含设置,内存管理和向量数学. 这次蛤蟆接着学习collison模块. 理论介绍 这个collision模块包括了shapes和函数.同时包括一个动态树和broad-phase(蛤蟆不知道怎么解释这个)用于加速碰撞系统.这个模块设计的时候是在动态系统之外使用的.        Shape 这里的shapes描述了碰撞几何,可

瘸腿蛤蟆笔记31-cocos2d-x-3.2 Box2d物理引擎Fixture类介绍

上篇回顾 本篇名言:好的木材并不在顺境中生长:风越强,树越壮. [马里欧特] 上篇中,我们学习了dynamics模块中的Body类,从定义到创建再到使用基本上都覆盖了,就差实战了(这个蛤蟆后在后面中补上的). 接下去蛤蟆继续学习dynamics模块中的类,这次咱们学习Fixture这个类. 理论介绍 我们知道Shape可以不知道Body,独立于物理仿真使用.所以Box2d需要Fixture类来将shape附加到Body.一个Body可以有1个或者多个Fixture.一个拥有多个fixture的B

瘸腿蛤蟆笔记29-cocos2d-x-3.2 Box2d物理引擎dynamics模块介绍

上篇回顾 本篇名言:奋斗.寻觅.发现,而不屈服.[诗人丁尼生] 上篇中,我们学习了Box2d物理引擎的三大模块之一的collision模块,该模块主要包含形状shape,碰撞函数和动态树等概念. 这次蛤蟆接着学习dynamics模块. 理论介绍 Dynamics模块是Box2d引擎中最复杂的,也是基本上我们打交道最多的模块了.该模块建立在common和collision模块之上,所以需要我们先了解common和collision模块. Dynamics模块包含几大类:  fixture cla

瘸腿蛤蟆笔记19-cocos2d-x-3.2 屏幕锁定精灵运动

上篇回顾 上篇中,蛤蟆学习了OrbitCamera的使用,并了解了其大概.虽然那个OrbitCamera::create函数中参数比较难理解,但是我们还是抽象的尝试说明了一下.呵呵,这次蛤蟆学习如何用屏幕锁定精灵的运行. 理论介绍 首先我们来看下 继承关系如下. Follow直接继承于Action类的,看上去还挺老资格的,其实也是老资格的.谁让人家辈分靠前呢. 类的创建函数是: static Follow* create ( Node *  followedNode, const Rect & 

Linux 程序设计学习笔记----终端及串口编程基础之概念详解

转载请注明出处,谢谢! linux下的终端及串口的相关概念有: tty,控制台,虚拟终端,串口,console(控制台终端)详解 部分内容整理于网络. 终端/控制台 终端和控制台都不是个人电脑的概念,而是多人共用的小型中型大型计算机上的概念. 1.终端 一台主机,连很多终端,终端为主机提供了人机接口,每个人都通过终端使用主机的资源. 终端有字符哑终端和图形终端两种. 控制台是另一种人机接口, 不通过终端与主机相连, 而是通过显示卡-显示器和键盘接口分别与主机相连, 这是人控制主机的第一人机接口.

笔记-【3】-event事件对象的详解!

event事件对象:是指当前对象发生的事件的一些详细的信息在event这个对象里. event对象从哪里来?从事件函数中传入 obj. //e就会当前的事件对象event } 对象就有属性和方法:那么event对象也有属性和方法 event的属性和方法: { 属性: button :  当前事件的方法中判断鼠标的按键位置 有三个值: 0 (左键) 1(滚轮) 2(右键) ctrlkey:  判断是否按下了ctrl键; altkey:  判断是否按下了alt键; shiftkey:  判断是否按下

iOS回顾笔记(04) -- UIScrollView的基本使用详解

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption

【linux_笔记】Linux_文件查找(find)详解&&特殊权限

学习资源来自:www.magedu.com 学习记录过程中难免出现错误,如有发现,还望大神们指出. 示例操作部分有的与历史操作有关,如果先前的示例操作没有执行过的话,可能会有部分示例的操作无法执行.示例仅供参考(练习题在附录). 文件查找: locate(不常用):非实时,模糊匹配,根据全系统文件数据库进行查找,速度快:# updatedb, 手动生成文件数据库(非常耗时) find:实时,精确,支持众多查找标准,遍历指定目录中的所有文件完成查找,速度慢: 命令格式:find 查找路径 查找标准