首页 > 代码库 > 16--Box2D使用(二、显示物理世界)
16--Box2D使用(二、显示物理世界)
在上一篇文章中我们创建了的一个物理世界,当物理世界中的刚体一个也没有显示出来。为显示物理世界中的物体,我们需要引入GLES-Render(调试Box2D使用)。这两个文件可以再
%Cocos_Home%\samples\Cpp\TestCpp\Classes\Box2DTestBed中找到,将这两个文件拷贝到项目中并引入工程中。
再声明一个变量
b2World* world; b2Body* wallBody ; float32 wallLineOffset ; GLESDebugDraw* m_debugDraw; //调试物理世界绘制对象
声明两个函数
void printDebugDraw(bool isPrint); virtual void draw();
printDebugDraw实现
void HelloWorld::printDebugDraw(bool isPrint){ if(!isPrint) return; //根据像素与米的转换系数创建调试绘制对象 m_debugDraw = new GLESDebugDraw( PIXEL_TO_METER ); world->SetDebugDraw(m_debugDraw); uint32 flags = 0; flags += b2Draw::e_shapeBit; //显示刚体上的形状 // flags += b2Draw::e_jointBit; //显示关节 // flags += b2Draw::e_aabbBit; // flags += b2Draw::e_pairBit; // flags += b2Draw::e_centerOfMassBit; m_debugDraw->SetFlags(flags); }
draw实现
void HelloWorld::draw() { CCLayer::draw(); ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position ); kmGLPushMatrix(); world->DrawDebugData(); kmGLPopMatrix();}
修改createWorld
void HelloWorld::createWorld(){ b2Vec2 gravity; gravity.Set(0.0f,-9.0f); //物理世界重力向量,这里创建一个向下的重力向量 b2BodyDef* bodydef = new b2BodyDef(); world = new b2World(gravity); //根据重力向量创建物理世界对象 world->SetAllowSleeping(true); //允许休眠 world->SetWarmStarting(true); //初始状态将受到重力影响 printDebugDraw(true);}
物理世界的物体就显示出来了,但那几个球怎么没有动呢?不用急,是因为我们还没有让物理世界运行起来。
让物理世界运行起来
添加函数
void HelloWorld::update(float dt){ //速度迭代次数 int velocityIterations = 8; //位置迭代次数 int positionIterations = 1; world->Step(dt, velocityIterations, positionIterations); //dt为时间步长}
在init方法中添加代码
bool HelloWorld::init(){ ////////////////////////////// // 1. super init first if ( !CCLayer::init() ) { return false; } wallLineOffset = 0.5; this->createWorld(); this->createWall(); this->createBall(); this->scheduleUpdate(); //不断调用update函数 …… return true;}
再运行看看效果
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。