zoukankan      html  css  js  c++  java
  • 实例介绍Cocos2d-x中Box2D物理引擎:使用关节

    下面我们将使用Box2D物理引擎技术进行重构。使得关节能够掌握如何在Box2D使用关节约束。
    HelloWorldScene.cpp中与使用关节的相关代码如下:

    [html] view plaincopy
     
    1. void HelloWorld::addNewSpriteAtPosition(Vec2 p)  
    2. {      
    3.     log("Add sprite %0.2f x %02.f",p.x,p.y);  
    4.   
    5.   
    6.     //创建物理引擎精灵对象A  
    7.     auto spriteA = Sprite::create("BoxA2.png");                                 ①  
    8.     spriteA->setPosition(p);  
    9.     this->addChild(spriteA);  
    10.   
    11.   
    12.     // 动态物体A定义  
    13.     b2BodyDef bodyDef;  
    14.     bodyDef.type = b2_dynamicBody;  
    15.     bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);  
    16.     b2Body *bodyA = world->CreateBody(&bodyDef);  
    17.     bodyA->SetUserData(spriteA);                                         ②  
    18.   
    19.   
    20.     //创建物理引擎精灵对象B  
    21.     auto spriteB = Sprite::create("BoxB2.png");                                 ③  
    22.     spriteB->setPosition(p + Vec2(100, -100));                                   ④  
    23.     this->addChild(spriteB);  
    24.   
    25.   
    26.     // 动态物体B定义  
    27.     bodyDef.type = b2_dynamicBody;  
    28.     Vec2 posB = spriteB->getPosition();  
    29.     bodyDef.position.Set(posB.x/PTM_RATIO , posB.y /PTM_RATIO);                 ⑤  
    30.     b2Body *bodyB = world->CreateBody(&bodyDef);  
    31.     bodyB->SetUserData(spriteB);                                         ⑥  
    32.   
    33.   
    34.     // 定义2米见方的盒子形状  
    35.     b2PolygonShape dynamicBox;  
    36.     dynamicBox.SetAsBox(1, 1);  
    37.   
    38.   
    39.     // 动态物体夹具定义  
    40.     b2FixtureDef fixtureDef;  
    41.     //设置夹具的形状  
    42.     fixtureDef.shape = &dynamicBox;  
    43.     //设置密度  
    44.     fixtureDef.density = 1.0f;  
    45.     //设置摩擦系数  
    46.     fixtureDef.friction = 0.3f;  
    47.     //使用夹具固定形状到物体上  
    48.     bodyA->CreateFixture(&fixtureDef);                                       ⑦  
    49.     bodyB->CreateFixture(&fixtureDef);                                       ⑧  
    50.   
    51.   
    52.     // 距离关节定义  
    53.     b2DistanceJointDef jointDef;                                            ⑨  
    54.     jointDef.Initialize(bodyA, bodyB, bodyA->GetWorldCenter(),  
    55.         bodyB->GetWorldCenter());                                            ⑩  
    56.     jointDef.collideConnected = true;                                       ⑪  
    57.     bodyA->GetWorld()->CreateJoint(&jointDef);                                    ⑫  
    58.   
    59.   
    60. }  



    上述代码第①~②行是创建精灵对象A和创建物体A。第③~⑥行是创建精灵对象B和创建物体B。代码第④行是设置精灵B的位置,p是触摸点的位置,p + Vec2(100, -100)表示在触摸点的右下方,相对位置(100, -100)。第⑤行代码是设置物体B的位置,它的单位是米,因此需要精灵B的位置除以PTM_RATIO。
    第⑦行和第⑧行代码是使用夹具固定形状(2米见方的盒子形状)到物体A和物体B上。由于形状相相同,使用同一个夹具定义fixtureDef分别固定到物体上。
    第⑨~⑫行代码是添加距离关节,其中第⑨行代码b2DistanceJointDef jointDef是声明距离关节定义,第⑩行代码jointDef.Initialize(bodyA, bodyB, bodyA->GetWorldCenter(),bodyB->GetWorldCenter())是初始化距离关节定义,其中第一个和第二参数是物体A和物体B的锚点,第三参数和第四参数是物体A和物体B的世界坐标,bodyA->GetWorldCenter()函数是获得物体A中心点的世界坐标。第⑪行代码jointDef.collideConnected = true是允许相连的物体碰撞。第⑫行代码bodyA->GetWorld()->CreateJoint(&jointDef)是通过物理世界对象根据jointDef(关节定义)创建关节。
    在上面的实例中,我们只是使用了距离关节,而Box2D v2版本中定义了很多关节。这些关节包括:
    距离关节。两个物体之间保持固定的距离。每个物体上的点称为锚点。关节定义是b2DistanceJointDef。
    旋转关节。允许物体围绕公共点旋转。关节定义是b2RevoluteJointDef。
    平移关节。两个物体之间的相对旋转是固定的,它们可以沿着一个坐标轴进行平移。关节定义是b2PrismaticJointDef。
    焊接关节。可以把物体固定在相同方向上。关节定义是b2WeldJointDef。
    滑轮关节。滑轮关节用于创建理想的滑轮,两个物体位于绳子两端,绳子通过某个固定点(滑轮的位置)将两个物体连接起来。这样当一个物体升起时,另一个物体就会下降。滑轮两端的绳子总长度不变。关节定义是b2PulleyJointDef。
    摩擦关节。降低两个物体之间的相对运动。关节定义是b2FrictionJointDef。
    齿轮关节。控制其它两个关节(旋转关节或者平移关节),其中一个的运动会影响另一个。关节定义是b2GearJointDef。
    鼠标关节。点击物体上任意一个点可以在世界范围内进行拖动。关节定义是b2MouseJointDef。

    这些关节定义初始化的时候参数都各不相同,但是参数都是比较类似的。此外,除了上面列出的关节外,还有一些其它的关节,这关节不是很常用,这里不再一一介绍了。

    更多内容请关注国内第一本Cocos2d-x 3.2版本图书《Cocos2d-x实战:C++卷》
    本书交流讨论网站:http://www.cocoagame.net
    更多精彩视频课程请关注智捷课堂Cocos课程:http://v.51work6.com
    欢迎加入Cocos2d-x技术讨论群:257760386

    欢迎关注智捷iOS课堂微信公共平台

  • 相关阅读:
    Head first javascript(七)
    Python Fundamental for Django
    Head first javascript(六)
    Head first javascript(五)
    Head first javascript(四)
    Head first javascript(三)
    Head first javascript(二)
    Head first javascript(一)
    Sicily 1090. Highways 解题报告
    Python GUI programming(tkinter)
  • 原文地址:https://www.cnblogs.com/iOS-Blog/p/4014245.html
Copyright © 2011-2022 走看看