【Cocos入门】物理检测

在这里插入图片描述

一、物理检测的概念

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);

这里,对参数进行一下说明:

  1. p1,p2是线段的起点和终点
  2. 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("======")
            }
        }

    }

Cocos官网更多详情

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Keep up

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值