码迷,mamicode.com
首页 > 其他好文 > 详细

box2d——1.tiles瓦片积木

时间:2019-05-18 18:56:01      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:ati   csdn   div   tiles   imu   效果图   manage   render   tcp   

【调试渲染】

? 将TestCpp里Box2DTestBed的GLES-Render.h/cpp加入到项目中。声明绘制变量:GLESDebugDrawmDebugDraw。

【创建世界】 ?

	// 依据重力创建世界
	b2Vec2 gravity;
	gravity.Set(0.0f, -10.0f);
	mWorld = new b2World(gravity);

	// 设置调试渲染和碰撞侦听
	mWorld->SetDebugDraw(&mDebugDraw);
	mWorld->SetContactListener(this);

	// 创建地面身体
	b2BodyDef goundBodyDef;
	mGroundBody = mWorld->CreateBody(&goundBodyDef);

	// 设置物理更新函数
	schedule(schedule_selector(CTilesLayer::tick));
【创建物体】

	mFixtureCount = 0;
	b2Timer timer;
	// 创建静态的矩形(1个body多个shape、fixture)
	{
		float32 a = 0.5f;
		b2BodyDef bd;
		bd.position.y = -a;
		b2Body* ground = mWorld->CreateBody(&bd);

		int32 N = 200;
		int32 M = 10;
		b2Vec2 position;
		position.y = 0.0f;
		for (int32 j = 0; j < M; ++j)
		{
			position.x = -N * a;
			for (int32 i = 0; i < N; ++i)
			{
				b2PolygonShape shape;
				shape.SetAsBox(a, a, position, 0.0f);
				ground->CreateFixture(&shape, 0.0f);
				++mFixtureCount;
				position.x += 2.0f * a;
			}
			position.y -= 2.0f * a;
		}
	}

	// 创建动态的矩形(一个shape多个body)
	{
		float32 a = 0.5f;
		b2PolygonShape shape;
		shape.SetAsBox(a, a);

		b2Vec2 x(-7.0f, 0.75f);
		b2Vec2 y;
		b2Vec2 deltaX(0.5625f, 1.25f);
		b2Vec2 deltaY(1.125f, 0.0f);

		enum { e_count = 20 };
		for (int32 i = 0; i < e_count; ++i)
		{
			y = x;

			for (int32 j = i; j < e_count; ++j)
			{
				b2BodyDef bd;
				bd.type = b2_dynamicBody;
				bd.position = y;

				b2Body* body = mWorld->CreateBody(&bd);
				body->CreateFixture(&shape, 5.0f);
				++mFixtureCount;
				y += deltaY;
			}

			x += deltaX;
		}
	}
【设置物理显示】

	// 设置显示
	mTextLine = 30;
	setScale(15);
	setAnchorPoint( ccp(0,0) );
	CCSize screenSize = CCDirector::sharedDirector()->getWinSize();
	setPosition( ccp(screenSize.width/2, screenSize.height/3) );

	// 设置物理
	uint32 flags = 0;
	flags += b2Draw::e_shapeBit;
	flags += b2Draw::e_jointBit;
	mDebugDraw.SetFlags(flags);

	mWorld->SetWarmStarting(true);
	mWorld->SetContinuousPhysics(true);
	mWorld->SetSubStepping(false);

【绘制物理】

void CTilesLayer::draw()
{
	CCLayer::draw();

	ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );

	kmGLPushMatrix();
	// 绘制物理数据
	mWorld->DrawDebugData();

	kmGLPopMatrix();

	CHECK_GL_ERROR_DEBUG();
}
【更新物理】

void CTilesLayer::tick(float dt)
{
	// 显示
	const b2ContactManager& cm = mWorld->GetContactManager();
	int32 height = cm.m_broadPhase.GetTreeHeight();
	int32 leafCount = cm.m_broadPhase.GetProxyCount();
	int32 minimumNodeCount = 2 * leafCount - 1;
	float32 minimumHeight = ceilf(logf(float32(minimumNodeCount)) / logf(2.0f));
	mDebugDraw.DrawString(5, mTextLine, "dynamic tree height = %d, min = %d", height, int32(minimumHeight));
	mTextLine += 15;

	mWorld->Step(1/60.0f, 8, 3);
	mWorld->DrawDebugData();

	mDebugDraw.DrawString(5, mTextLine, "create time = %6.2f ms, fixture count = %d",
		mCreateTime, mFixtureCount);
	mTextLine += 15;

}

【效果图和下载】

技术图片

技术图片

代码下载地址

box2d——1.tiles瓦片积木

标签:ati   csdn   div   tiles   imu   效果图   manage   render   tcp   

原文地址:https://www.cnblogs.com/ldxsuanfa/p/10886603.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
分享档案
周排行
mamicode.com排行更多图片
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!