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

在游戏中咱们能够经过关节约束两个物体的运动。咱们经过一个距离关节实例,介绍一下如何在使用关节。

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

 

使用距离关节实例web

 

 

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

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

HelloWorldScene.cpp中与使用关节的相关代码以下:函数

[html] view plaincopyoop

<EMBED id=ZeroClipboardMovie_1 height=18 name=ZeroClipboardMovie_1 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=1&width=18&height=18" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">网站

  1. bool HelloWorld::onTouchBegan(Touch* touch, Event* event)  this

  2. {  spa

  3. Vec2 location = touch->getLocation();  .net

  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) 设置与精灵相关的物体对象。第⑤行是将精灵添加到当前层中。

建立完成boxAboxABody,下面又紧接着建立了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课堂微信公共平台

相关文章
相关标签/搜索