• 实例介绍Cocos2d-x物理引擎:使用关节


    在游戏中我们可以通过关节约束两个物体的运动。我们通过一个距离关节实例,介绍一下如何在使用关节。

    这个实例的运行后的场景如图所示,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触摸点和附近生成两个新的精灵,它们的运行是自由落体运动,它们之间的距离是固定的。图示是开启了绘制调试遮罩,从图中可见,调试遮罩不仅会显示物体,还会显示关节。

     

    使用距离关节实例

     

    使用距离关节实例(绘制调试遮罩)

    代码部分中HelloWorldScene.h文件与上一节的实例非常类似,不再介绍了。HelloWorldScene.cpp中创建物理世界和指定世界的边界语句是在HelloWorld::createScene()和HelloWorld::init()函数中,这两个函数类似于上一节实例,这里也不再解释这些函数代码了。

    HelloWorldScene.cpp中与使用关节的相关代码如下:

    1. bool HelloWorld::onTouchBegan(Touch* touch, Event* event)  
    2. {  
    3. Vec2 location = touch->getLocation();  
    4. addNewSpriteAtPosition(location);  
    5. return false;  
    6. }  
    7.    
    8. void HelloWorld::addNewSpriteAtPosition(Vec2 p)  
    9. {    
    10. Size visibleSize = Director::getInstance()->getVisibleSize();  
    11. Vec2 origin = Director::getInstance()->getVisibleOrigin();  
    12.    
    13. auto boxA = Sprite::create("BoxA2.png");     ①  
    14. boxA->setPosition(origin+ p);     ②  
    15.    
    16. auto boxABody = PhysicsBody::createBox(boxA->getContentSize());   ③  
    17. boxA->setPhysicsBody(boxABody);   ④  
    18. addChild(boxA, 10, 100);     ⑤  
    19.    
    20. auto boxB = Sprite::create("BoxB2.png");  
    21. boxB->setPosition(origin + p + Vec2(0, -120));  
    22. auto boxBBody = PhysicsBody::createBox(boxB->getContentSize());  
    23. boxB->setPhysicsBody(boxBBody);  
    24. addChild(boxB, 20, 101);  
    25.    
    26. auto world = this->getScene()->getPhysicsWorld();  ⑥  
    27.    
    28. PhysicsJointDistance* joint = PhysicsJointDistance::construct(boxABody, boxBBody,   
    29. Vec2(0, 0), Vec2(0, boxB->getContentSize().width / 2));   ⑦  
    30.    
    31. world->addJoint(joint);   ⑧  
    32.    
    33. }  

    上面代码onTouchBegan函数是触摸响应函数,在onTouchBegan中调用addNewSpriteAtPosition函数。在addNewSpriteAtPosition中创建两个精灵,创建两个物体,并设置它们之间的关节约束。代码第①行创建精灵boxA,第②行设置它的位置。第③行代码PhysicsBody::createBox(boxA->getContentSize())是创建矩形盒子物体。第③行代码boxA->setPhysicsBody(boxABody) 是设置与精灵相关的物体对象。第⑤行是将精灵添加到当前层中。

    创建完成boxA和boxABody,下面又紧接着创建了boxB 和boxBBody对象。创建好它们之后就可以进行添加关节约束了,第⑥行代码auto world = this->getScene()->getPhysicsWorld()是从场景中获得物理世界(PhysicsWorld)对象。第⑦行代码通过PhysicsJointDistance的静态函数construct创建距离关节对象,其中锚点坐标采用的模型坐标(本地坐标),如果获得的不是模型坐标,可以进行坐标转换。PhysicsBody中提供两个坐标转换函数:

     Vec2 world2Local(const Vec2& point)。世界坐标转换为模型坐标。

    Vec2 local2World(const Vec2& point)。模型坐标转换为世界坐标。

    最后第⑧行代码world->addJoint(joint)语句是将创建关节添加到物理世界中。

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

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

  • 相关阅读:
    Balanced Number [ZOJ 3416]
    动态树
    Jason的特殊爱好 [FZU 2113]
    Raney引理
    Tri Tiling [POJ 2663]
    糖尿病的虾青素+胰岛素疗法 (转)
    JAVASCRIPT 开发工具:aptana ,WebStorm
    众志和达,英文SOUL 存储与数据安全提供商
    健身音乐及其它
    nodejs + CompoundJS 资源
  • 原文地址:https://www.cnblogs.com/iOS-Blog/p/4002678.html
Copyright © 2020-2023  润新知