主要是有以下三个步骤:
1.碰撞检测时检测的是物体的形状是否有碰撞,所以是在定义形状的时候设置碰撞信息:
ball.setCollisionType(1) ;
walls[i].setCollisionType(2) ;
2.实现碰撞时回调的函数
arbiter:封装了碰撞的形状和它们的碰撞数据
arbiter常用的方法:
cpFloat cpArbiterGetElasticity(const cpArbiter *arb)
void cpArbiterSetElasticity(cpArbiter *arb, cpFloat value)
计算碰撞对的弹性。在
preSolve()
回调中设定该值将会覆盖由空间计算的值。默认计算会将两个形状的弹性相乘。
cpFloat cpArbiterGetFriction(const cpArbiter *arb)
void cpArbiterSetFriction(cpArbiter *arb, cpFloat value)
计算碰撞对的摩擦力。在
preSolve()
回调中设定该值将会覆盖由空间计算的值。默认计算会将两个形状的摩擦力相乘。
cpVect cpArbiterGetSurfaceVelocity(const cpArbiter *arb)
void cpArbiterSetSurfaceVelocity(cpArbiter *arb, cpVect value)
计算碰撞对的表面速度。在
preSolve()
回调中设定该值将会覆盖由空间计算的值
3.管理碰撞
例子:
<span style="white-space:pre"> </span>//四个回调函数
var collisionBegin = function(arbiter,space){
cc.log("begin") ;
var shapes = arbiter.getShapes() ;
var typeA = shapes[0].collision_type ;
var typeB = shapes[1].collision_type ;
if(typeB == 1)
cc.log("ball to ball") ;
else
cc.log("ball to wall....") ;
return true ;
};
var collisionPre = function(arbiter,space){
// cc.log("pre") ;
return true ;
};
var collisionPost =function(arbiter,space){
// cc.log("post") ;
};
var collisionSeparate = function(arbiter,space){
// cc.log("separate") ;
};
//管理碰撞
this.space.addCollisionHandler(1,1,
collisionBegin.bind(this) ,
collisionPre.bind(this) ,
collisionPost.bind(this) ,
collisionSeparate.bind(this)
)
this.space.addCollisionHandler(1,2,
collisionBegin.bind(this) ,
collisionPre.bind(this) ,
collisionPost.bind(this) ,
collisionSeparate.bind(this)
)