PhysicsBody物理世界

本文详细介绍如何在Cocos2d-x 3.2版本中使用物理系统创建场景,包括创建圆形和四边形物理Body,并实现边界碰撞效果。文中还介绍了如何进行碰撞检测,包括通过Body、形状及组别进行碰撞检测的方法。
摘要由CSDN通过智能技术生成

介绍

在3.2的重力系统,创建场景就不能用Scence *s = Scence::create(); 要用:Scence *s = Scence::createWithPhysics();

bool T07PhysicsWorld::init()
{
	Layer::init();

	PhysicsBody* bodyA;
	PhysicsBody* bodyB;

	{
		//createCircle 创建一个圆形的body
		PhysicsBody* body = PhysicsBody::createCircle(20, PhysicsMaterial(1.0f, 1.0f, 0.0f));//PhysicsMaterial(密度,弹力,摩擦力)
		bodyA = body;
		Sprite* sprite = Sprite::create();
			#if 0
			/*
			此处精灵看不见,因为没有具体的精灵,在3.2里我们可以把这个body的边框画出来,在场景那边设置下:
				Scene* s = Scene::createWithPhysics();
				//就是下面这两句
				PhysicsWorld* world = s->getPhysicsWorld();//取出世界
				world->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
			
			*/
			#endif
		sprite->setPhysicsBody(body);
		addChild(sprite);
		sprite->setPosition(winSize.width / 2, winSize.height / 2);

		//设置速度,在x, y方向的速度。
		body->setVelocity(Vect(100, 200));
		
	}

	{
		//加四边形边框
		PhysicsBody* body = PhysicsBody::createEdgeBox(winSize, PhysicsMaterial(1.0f, 1.0f, 0.0f));
		bodyB = body;
		Sprite* sprite = Sprite::create();
		addChild(sprite);
		sprite->setPhysicsBody(body);
		sprite->setPosition(winSize.width / 2, winSize.height / 2);

		
	}

	//碰撞检测
	{
		//body碰撞要设置BitMask,表示这个body要不要计算碰撞
		bodyA->setContactTestBitmask(0x1);
		bodyB->setContactTestBitmask(0x1);
		//设置是哪个组的。组与组之间碰撞检测,组内部不做碰撞检测。
		bodyA->setGroup(1);
		bodyB->setGroup(2);
		
		//碰撞检测
		auto ev = EventListenerPhysicsContactWithBodies::create(bodyA, bodyB);
			
		//当碰撞开始时调用此函数
		ev->onContactBegin = [](PhysicsContact& contact){
			CCLog("Began Contact...........");
			return true;
		};

		_eventDispatcher->addEventListenerWithSceneGraphPriority(ev, this);
	}

	//也可以通过形状做碰撞检测
	{
		//一个body对应多个Shapes
		auto ev = EventListenerPhysicsContactWithShapes::create(bodyA->getShapes().at(0),
			bodyB->getShapes().at(0));

		ev->onContactBegin = [](PhysicsContact& contact){
			CCLog("Shape Began Contact...........");
			return true;
		};

		_eventDispatcher->addEventListenerWithSceneGraphPriority(ev, this);
	}

	{
		auto ev = EventListenerPhysicsContactWithGroup::create(3); //3是Gid等于3的有碰撞,就调用。类推。
		ev->onContactBegin = [](PhysicsContact& contact){
			CCLog("Group Began Contact...........");
			return true;
		};
		_eventDispatcher->addEventListenerWithSceneGraphPriority(ev, this);

	}

	return true;
}



一个body可以对应多个shape,比如复杂的形状可以拆分为几个shape,如乌龟可以将头和脚等分开。

	{
		PhysicsBody* body = PhysicsBody::create();

		PhysicsShape* shape1 = PhysicsShapeBox::create(Size(40, 40), PHYSICSBODY_MATERIAL_DEFAULT, Vec2::ZERO);
		body->addShape(shape1);

		PhysicsShape* shape2 = PhysicsShapeCircle::create(10, PHYSICSBODY_MATERIAL_DEFAULT, Vec2(-30, 0));
		body->addShape(shape2);

		//	Sprite* sprite = Sprite::create();
		Node* node = Node::create();
		node->setPhysicsBody(body);
		addChild(node);
		node->setPosition(winSize.width / 2, winSize.height / 2);
	}

	// 边框
	{
		PhysicsBody* body = PhysicsBody::createEdgeBox(winSize, PhysicsMaterial(1.0f, 1.0f, 0.0f));
		Sprite* sprite = Sprite::create();
		addChild(sprite);
		sprite->setPhysicsBody(body);
		sprite->setPosition(winSize.width / 2, winSize.height / 2);
	}










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值