Cocos2d-x教程(30)-3.x版本号物理引擎的使用

Cocos2d-x教程(30)-3.x版本号物理引擎的使用

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

欢迎加入Cocos2d-x 交流群:193411763

转载时请注明原文出处 : http://blog.csdn.net/u012945598/article/details/38417333



在Cocos2d-x 2.x的版本号中,开发人员能够直接使用Box2d或chipmunk进行物理世界的模拟。

在第17篇教程(http://blog.csdn.net/u012945598/article/details/17787243)我们也以前介绍过Box2d物理引擎的使用,可是Box2d中的api对于刚接触物理引擎的开发人员来说仍然显得非常复杂。

在Cocos2d-x 3.0版本号中,Cocos2d-x对物理引擎的进行了封装,使其融入2d-x中,避免了开发人员直接使用物理引擎较为复杂的接口,使物理引擎的使用变得十分简单(眼下3.0版本号封装的是chipmunk物理引擎,该引擎在功能上不及Box2d,但使用方法简单)。

在2.x版本号中若要模拟一个物理世界并使精灵受到物理效果的影响大体须要例如以下几步:
(1) 创建一个物理世界。

(2) 创建物体(Body)。

(3) 创建夹具/框架(Fixture)。

(4) 创建关节(Joints)。

(5) 第四部可依据须要进行取舍,最后设置用户交互。

这样在2.x版本号中就能够模拟出来一个物理世界,碰撞检測可通过继承b2ContactListener重写BeginContact函数来实现。

在3.x版本号中,既然api已经被封装到引擎内的组件,使用时便无需那么麻烦了,但仍然须要几个步骤方可使用物理引擎。

(1) 使用Scene类的提供的工厂方法createWithPhysics()创建一个带有物理世界的场景。

(2) 使用PhysicsBody类创建物体,同一时候也对物体的夹具及形状进行了绑定。

(3) 使用Node类setPhysicsBody()方法将节点与物体绑定,即设置用户交互(Sprite,ImageView等均属于Node派生类,可訪问此方法)。

(4) 若有须要,使用PhysicsJointLimit类创建关节,将物体进行连接,将关节加入�到world就可以。

(5) 碰撞检測事件由EventListenerPhysicsContact监听,创建实例对象后设置对应的回调函数就可以。


虽然步骤看上去并未降低,但实际上在3.x版本号中使用物理引擎代码的复杂度要比2.x小的多。

以下写一个简单的Demo来模拟这个过程。


首先创建一个能够支持物理世界的场景。


以下创建一个边框,用来防止屏幕上的刚体受到重力影响掉出屏幕,EdgeBox默认不受重力影像(静态刚体),在物理世界中若想要物体不受影像可通过setGravityEnable(false)方法实现。



接下来在物理世界中再创建两个物体,并使用关节将它们连接起来


这个时候执行项目实际上就已经能够看到效果了,最后来加入�碰撞检測的事件。



此时执行项目能够看到效果图:
Cocos2d-x教程(30)-3.x版本号物理引擎的使用

在上述过程中,我们所使用的碰撞体均为规则形状,然而在做精确碰撞检測时,所遇到的图形实际上大多为不规则图形,以下来演示不规则物体的创建。此处须要使用到一种工具,叫做VextexHelper

(下载地址:http://download.csdn.net/detail/u012945598/7725475)

下载之后解压,这个工具实际上就是一个Xcode下的project,打开project文件执行就可以,效果图例如以下:

Cocos2d-x教程(30)-3.x版本号物理引擎的使用

对于上图绿色边框部分为笔者所画出的边缘,之后该程序会依据各个点生成一个数组。我们真正须要用到的就是红色矩形里面的坐标,当然这个格式跟我们实际上的格式有些出入,其实这个格式能够在该工具的代码中进行改动,使输出的类型变成Point。

将这些数据复制到我们的项目中就能够使用了:

执行效果例如以下:

Cocos2d-x教程(30)-3.x版本号物理引擎的使用


最后,虽然Cocos对物理引擎进行了封装,但实际使用时须要注意的地方还有非常多地方。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118320.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基于大数据的舆情分析_舆情与大数据

    基于大数据的舆情分析_舆情与大数据数据工厂,是一套多组件化数据清洗加工及数据存储管理平台,同时能够管理所有的数据库的备份方案。支持多数据源类型的数据同步实现和数据仓库其他的数据源互通。对接收数据进行解压,对外提供压缩后的数据。

    2026年2月2日
    4
  • 各大免费邮箱邮件群发账户SMTP服务器配置及SMTP发送量限制情况

    各大免费邮箱邮件群发账户SMTP服务器配置及SMTP发送量限制情况分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!点击浏览教程网络产品推广和新闻消息推送时,经常用到的工具就是用客户邮箱发送邮件了,如果是要发送的邮件量非常大的话,一般的建议是搭建自己的邮局服务器,或者是花钱购买专业的邮件群发服务,免费邮箱的SMTP适合少量的邮件群发需求。例如Wordpress的评论邮件通知功能,每天要发送的邮件数量…

    2022年10月3日
    3
  • 封装是怎么实现的_ad13怎么添加封装

    封装是怎么实现的_ad13怎么添加封装1.封装的概念(1)将东西包装在一起,然后以新的完整的形式呈现出来(即将属性和方法封装到类里面,通过添加访问修饰符来限制访问权限,以达到信息隐藏的目的)(2)信息隐藏:隐藏对象的实现细节,不让外部

    2022年8月1日
    6
  • docker映射端口命令_docker底层原理

    docker映射端口命令_docker底层原理一、容器为什么要做端口映射查看宿主机的IP信息docker容器的IP信息下面面这一段这就是docker的网络,我们可以看到它的网段是172.17.0.0段的。3:docker0:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscnoqueuestateUPgroupdefaultlink/ether02:42:b6:4b:f0:16brdff:ff:ff:ff:ff:ffinet172.17.0

    2022年10月11日
    6
  • arm指令移位指令

    arm指令移位指令arm指令移位指令LSL逻辑左移ASL算术左移LSR逻辑右移ASR算术右移ROR循环右移RRX带扩展的循环右移ASL和LSL是等同的,可以自由互换。你可以用一个立即值(从0到31)指定移位数量,或用包含在0和31之间的一个值的寄存器指定移位数量。 逻辑或算术左移(LSL)MOVR1,#1

    2022年5月5日
    102
  • ODrive应用 #4 配置参数&指令「建议收藏」

    参数与指令我们将使用作为每个ODrive对象的占位符。每个ODrive控制器都是一个ODrive对象。在odrivetool中通常是odrv0。此外,我们将<axis>用作每个轴的占位符,这是ODrive对象的属性(例如odrv0.axis0)。轴表示电动机的连接位置。(M0和axis0对应,M1和axis1对应)文章目录参数与指令轴相应的指令状态机启动程序控制模式控制指令…

    2022年4月14日
    158

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号