目录
- 一、物理检测的概念
- 二、点测试
- 三、矩形测试
- 四、射线测试
一、物理检测的概念
CoCos中,物理检测也是物理系统的一部分,它不是用于检测物体的物理特性的,而是用来查询物体的(比如某个地方是否存在物理碰撞体)。其又分成:点检测、矩形检测和射线检测。
二、点测试
点测试将测试是否有碰撞体会包含一个世界坐标系下的点,如果测试成功,则返回一个包含这个点的碰撞体。注意:如果有多个碰撞体同时满足条件,点检测只会返回一个随机的结果,
点测试的用法:
let physicsCollider =cc,director.getPhysicsManager().testPoint(point);
点测试只能用于测试 type=dynamic 的刚体。
示例:
manager:cc.PhysicsManager;
onLoad(){
this.manager=cc.director.getPhysicsManager();
this.manager.enabled = true;
}
start () {
//点测试
let collider = this.manager.testPoint(cc.v2(200,200));
if(!collider){
cc.log("没有检测到碰撞体");
}else{
cc.log("name="+collider.node.name)
}
}
三、矩形测试
矩形测试将测试指定的一个世界坐标系下的矩形,如果一个碰撞体的包围盒与这个矩形有重叠部分,则这个碰撞体会被添加到返回列表中。
矩形测试的用法:
let colliders = cc,director.getPhysicsManager() .testAABB(rect);
并且和点测试一样,也只能检测dynamic类型的碰撞体。
示例:
manager:cc.PhysicsManager;
onLoad(){
this.manager=cc.director.getPhysicsManager();
this.manager.enabled = true;
}
start () {
//矩形测试
let collider = this.manager.testAABB(cc.rect(0,0,200,200));
if(collider.length == 0){
cc.log("没有检测到碰撞体");
}else{
for(let col of collider){
cc.log("name="+col.node.name)
}
}
}
四、射线测试
射线测试用来检测给定的线段穿过那些碰撞体,我们还可以获取到碰撞体在线段穿过碰撞体的那个点的法线向量和其他一些有用的信息。
用法如下:
let results = cc.director.getPhysicsManager().rayCast(p1, p2, type);
这里,对参数进行一下说明:
- p1,p2是线段的起点和终点
- type是射线测试的检测类型,包含四种类型:
- cc.RayCastType.AIl:检测射线路径上的所有碰撞体,检测到的结果顺序不是固定的,效率慢;
- cc.RayCastType.AllClosest:检测射线路径上的所有碰撞体,但是会对返回值进行删选,只返回每一个碰撞体距离射线起点最近的那个点的相关信息,效率最慢;
- cc.RayCastType.Any:检测射线路径上任意的碰撞体,一旦检测到任何碰撞体,将立刻结束检测其他的碰撞体,效率最快;
- cc.RayCastType.Closest:检测射线路径上最近的碰撞体,这是默认值,稍慢;
示例:
manager:cc.PhysicsManager;
onLoad(){
this.manager=cc.director.getPhysicsManager();
this.manager.enabled = true;
}
start () {
//射线测试
let collider = this.manager.rayCast(cc.v2(0,0),cc.v2(400,400),cc.RayCastType.AllClosest);
if(collider.length == 0){
cc.log("没有检测到碰撞体");
}else{
for(let col of collider){
cc.log("name="+col.collider.node.name)
cc.log("point="+col.point);
cc.log("======")
}
}
}