【cocos2d-x游戏开发】使用关节

在场景中我们可以使用关节来让两个刚体联系在一起。

首先创建一个物理世界

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); //把节点加入到场景中

}

下面是效果



相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...