精通Cocos2d-x游戏开发(进阶卷)
上QQ阅读APP看书,第一时间看更新

10.3 Box2d的调试渲染

Box2d只是一个物理引擎,本身并不提供显示功能,只提供物理模拟的功能,因此可以很方便地运用到那些2D游戏引擎当中,在Box2d引擎的代码中,提供了TestBed这个庞大的范例库。

在TestBed中,GLUT完成了物理场景的渲染,以及其他的一些输入和输出的工作,那么在Cocos2d-x中,对Box2d的TestBed略加修改就可以搬到TestCpp里面了。

Box2d虽然不支持渲染,但提供了一个用于调试的渲染接口,在libBox2d项目的Common目录下的b2Draw提供了绘制点、线、圆、多边形等的接口,根据传入的参数,使用OpenGL的接口绘制它们,cpp-tests的Box2DTestBed中,GLESRender实现了这个功能。

需要注意的一点是,TestBed渲染的内容是Debug Draw,而不是Game Draw,它仅仅只是一些点、线、圆而已(绘制的是调试内容,而不是游戏内容)。这套流程跟cpp-tests的Box2dTest不太一样。

不管是在Box2d的TestBed还是Cocos2d-x的Box2dTestBed,它们的b2Draw对象的实现都在很好的工作,并且以后应该也不会修改到这部分的代码,在这里介绍如何使用OpenGL来绘制点、线、圆之类并不是很恰当,所以关于DebugDraw的渲染,我们只介绍它们是如何工作的,而不讨论渲染的细节。

首先需要实现b2Draw接口,把它叫作GLESRender,并且需要有一个这个类的对象,通过World→SetDebugDraw(myDebugDraw);然后将它赋给World,接下来,在每一帧模拟完物理世界之后,调用World→DrawDebugData()。

在每次调用DrawDebugData()函数的时候,Box2d都会根据当前世界的所有对象的形状等信息,调用b2Draw对象的绘图函数来渲染。如果希望在Cocos2d-x中显示调试信息,来帮助确定物理对象的显示与实际的物理形状是否一致,可以使用cpp-tests中Box2dTestBed示例的GLES-Render.h和GLES-Render.cpp文件,将GLESDebugDraw设置为物理世界的调试渲染对象。