在场景中我们可以使用关节来让两个刚体联系在一起。
首先创建一个物理世界
Scene* HelloWorld::createScene() { // 'scene' is an autorelease object auto scene = Scene::createWithPhysics(); scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL); // 'layer' is an autorelease object auto layer = HelloWorld::create(); layer->setPhyworld(scene->getPhysicsWorld()); // add layer as a child to scene scene->addChild(layer); // return the scene return scene; }
然后在init函数里面设置世界
//定义世界的边界 auto body = PhysicsBody::createEdgeBox(visibleSize,PHYSICSBODY_MATERIAL_DEFAULT,5.0f); auto edgeNode = Node::create(); edgeNode->setPosition(Vec2(visibleSize.width / 2,visibleSize.height / 2)); edgeNode->setPhysicsBody(body); //把世界的边界加到这个节点上 this->addChild(edgeNode); //把世界节点加到场景中 setTouchEnabled(true); //设置为单点触摸 setTouchMode(Touch::DispatchMode::ONE_BY_ONE);
然后响应鼠标点击函数
bool HelloWorld::onTouchBegan(Touch* touch,Event* event)//单点触摸 { Vec2 location = touch->getLocation();//获取触摸点坐标 addNewSpriteAtPosition(location); return false; }
然后在点击位置添加精灵
void HelloWorld::addNewSpriteAtPosition(Vec2 p) { Size visibleSize = Director::getInstance()->getVisibleSize();//获取屏幕尺寸 Vec2 origin = Director::getInstance()->getVisibleOrigin();//获取窗口原点坐标 auto BoxA = Sprite::create("1.png");//创建精灵 BoxA->setPosition(origin + p); auto BoxABody = PhysicsBody::createBox(BoxA->getContentSize());//创建body BoxA->setPhysicsBody(BoxABody);//把body绑定到制定精灵上 addChild(BoxA,10,100);//把带有身体的精灵添加到场景中 /*addChild函数的参数有三个: 第一个就是精灵的指针 第二个就是绘制层的顺序,默认参数值为0,表示最高优先层导入,该值越大表示该层在最后加载(在最高一层) 第三个参数为Tag标记,如果以后在该类的其他方法中要访问这个变量时可以通过调用函数getChildByTag来取回该对象, 然后可以对该对象进行操作,这样做的好处是降低系统资源的占用*/ auto BoxB = Sprite::create("2.png"); BoxB->setPosition(origin + p + Vec2(0,-120)); auto BoxBBody = PhysicsBody::createBox(BoxB->getContentSize()); BoxB->setPhysicsBody(BoxBBody); addChild(BoxB,20,101); //BoxABody->setContactTestBitmask(0xFFFFFFFF); //BoxBBody->setContactTestBitmask(0xFFFFFFFF); auto world = this->getScene()->getPhysicsWorld();//从场景中获得物理世界的对象 PhysicsJointDistance* joint = PhysicsJointDistance::construct(BoxABody,BoxBBody,Vec2(0,0),BoxB->getContentSize().width / 2)); //创建一个距离节点 world->addJoint(joint); //把节点加入到场景中 }
下面是效果图