您的位置:首页 > 移动开发 > Cocos引擎

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

2014-11-03 15:53 225 查看
在场景中我们可以使用关节来让两个刚体联系在一起。

首先创建一个物理世界

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), Vec2(0, boxB->getContentSize().width / 2));
//创建一个距离节点
world->addJoint(joint); //把节点加入到场景中

}

下面是效果图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐