quick-cocos2d-x物理引擎之chipmunk(二)

来源:互联网 发布:2016淘宝开店得多少钱 编辑:程序博客网 时间:2024/05/16 18:32

发表于1年前(2013-11-02 13:43)   阅读(2684) | 评论(0) 4人收藏此文章, 我要收藏

3

慕课网,程序员升职加薪神器,点击免费学习

quick-cocos2d-x chipmunk 物理引擎 碰撞

上一篇讲了quick-cocos2d-x使用chipmunk的使用流程,介绍了World,Body,Shape的建立,这一篇将讲解如何处理物体之间的碰撞。

一、监听事件
quick-cocos2d-x中的chipmunk碰撞处理是通过监听事件来实现的。

-- 设置物体的碰撞类别,默认所有物体都是类别0Body:setCollisionType(type)-- handle是一个回调函数,碰撞处理将在这个函数中执行-- collisionTypeA和collisionTypeB是两个int值,表示要监听的是哪两种物体-- 这两个值在body中设置(上面所示的方法),两个值相同时为监听同种物体之间的碰撞World:addCollisionScriptListener(handler, collisionTypeA, collisionTypeB)-- handler回调函数,这个函数一定要返回true,不然碰撞后两个物体将会重合,即像是不碰撞一样-- eventType为碰撞的类别,有四种值:--   begin 开始碰撞--   preSolve 持续碰撞(相交),可以设置相交时独自的摩擦,弹力等--   postSolve 调用完preSolve后,做后期处理,比如计算破坏等等--   separate 分开,当删除一个shape时也会调用-- event为CCPhysicsCollisionEvent实例onCollisionListener(eventType, event)
示例:
body:setCollisionType(1)self.world:addCollisionScriptListener(handler(self, self.onCollisionListener), 1, 2)function PhysicsScene:onCollisionListener(eventType, event)    print(eventType)    return trueend

二、 CCPhysicsCollisionEvent 
在回调函数中,有个重要的参数就是event了,CCPhysicsCollisionEvent中包含很多碰撞时的信息
-- 获取CCPhysicsWorldevent:getWorld()-- 获取两个碰撞的bodyevent:getBody1()event:getBody2()-- 是否是两种物体第一次接触event:isFirstContact()-- 弹性系数,在preSolve之前设置可改变当前值event:setElasticity(elasticity)event:getElasticity()-- 摩擦系数,在preSolve之前设置可改变当前值event:setFriction(friction)event:getFriction()-- 碰撞时两物体的接触点数event:getCount()-- 获取接触点event:getPoint(index)

三、分组碰撞 
我们在做一款游戏的时候,可能里面有很多的物体类型,我们希望某一物体只与特定的其它物体碰撞,而不是全部都碰撞,这种情况下就需要对物体进行分组了,在quick-cocos2d-x中可通过以下方法来实现
-- body所在的碰撞层,默认值为0,同层的物体才会发生碰撞-- layers可以表示多个层,具体怎么达到的呢-- 当我们对一个物体分层时,所用的数字应该为[1,2,4,8,16,32,...]这样形式(倍增)来分-- 如A为1,B为2,C为4,即为基本层(layer),如果要求C可与A碰撞,则C的layers为1+4=5Body:setCollisionLayers(layers)-- body所在组,默认值为0,同个组的将不发生碰撞(除了0组)-- 优先级高于layer,当group不一样的时候才会考虑layersBody:setCollisionGroup(group)
从上面我们可以得出:
两个物体要想发生碰撞,就要
1、group不一样或都为0。
2、至少有一个layer(注意,非layers)是一样的
 
下面将通过一个具体的案例来讲解。
 
假如我们设计一个游戏,内容为上古部落之间的战争,有A,B,C,D四个部落,A和B为结盟关系,C,D则是各自独立的,这是一个三角混战的关系,那么就有以下的规则: 
1)A和B分别与C,D碰撞 
2)A和B之间不发生碰撞 
3)C与A,B,D之间都碰撞 
4)D与A,B,C之间都碰撞 
5)A,B,C,D之间各自(即A与A,B与B,...)不碰撞 
我们设计的基本层为:A=1,B=2,C=4,D=8 
 
可由上图得出它们各自的layers为 
A.layers=1 
B.layers=2 
C.layers=1+2+4+8 
D.layers=1+2+4+8 
上面有一些是重复的层,可以进行简化 
A.layers=1 
B.layers=2 
C.layers=1+2+4+8 
D.layers=1+2 +8 
还可以把C,D放在同一层4进行简化 
A.layers=1 
B.layers=2 
C.layers=1+2+4 
D.layers=1+2+4 
具体的分法并没有一个统一的方法,只要合乎上面的原则即可,而且物体多时会比较麻烦,大家要多加注意。 
设置layers只解决了1)——4)而已,5)还是没有解决,这就用到了group这一属性,我们把A,B,C,D设为不同的group即可 
A. group =1 
B. group =2 
C. group =3 
D. group =4 
最后的代码如下:
-- 为了程序清晰,layers不用求和A:setCollisionLayers(1)B:setCollisionLayers(2)C:setCollisionLayers(1+2+4+8)D:setCollisionLayers(1+2+4+8)A:setCollisionGroup(1)B:setCollisionGroup(2)C:setCollisionGroup(3)D:setCollisionGroup(4)

0 0
原创粉丝点击