白鹭引擎 - 碰撞检测 ( hitTestPoint )

1, 矩形碰撞检测

class Main extends egret.DisplayObjectContainer {

    /**
     * Main 类构造器, 初始化的时候自动执行, ( 子类的构造函数必须调用父类的构造函数 super )
     * constructor 是类的构造函数, 类在实例化的时候调用
     * egret.Event.ADDED_TO_STAGE, 在将显示对象添加到舞台显示列表时调度
     */
    public constructor() {
        super();
        this.addEventListener(egret.Event.ADDED_TO_STAGE, this.onAddToStage, this);
    }

    /**
     * 显示对象.hitTestPoint(x, y) 用于判断矩形与某个点是否发生碰撞
     * 以下为检测左右晃动的矩形是否与 点 300, 100 发生碰撞 (相交)
     */
    private onAddToStage(event: egret.Event) {
        var isHit:boolean = false;
        var infoText:egret.TextField = new egret.TextField();
        infoText.y = 200;
        infoText.text = "isHit: " + isHit;
        this.addChild(infoText);

        var shp:egret.Shape = new egret.Shape();
        shp.graphics.beginFill( 0xff0000 );
        shp.graphics.drawRect( 0,0,100,100);
        shp.graphics.endFill();
        this.addChild(shp);

        var append = 10;
        egret.startTick(function():boolean {
            shp.x += append;
            if (shp.x == 540) {
                append = -10;
            } else if (shp.x == 0) {
                append = 10;
            }
            isHit = shp.hitTestPoint(300, 100);
            infoText.text = "isHit: " + isHit;
            return true;
        }, this);
    }
}

2, 像素碰撞检测

class Main extends egret.DisplayObjectContainer {

    /**
     * Main 类构造器, 初始化的时候自动执行, ( 子类的构造函数必须调用父类的构造函数 super )
     * constructor 是类的构造函数, 类在实例化的时候调用
     * egret.Event.ADDED_TO_STAGE, 在将显示对象添加到舞台显示列表时调度
     */
    public constructor() {
        super();
        this.addEventListener(egret.Event.ADDED_TO_STAGE, this.onAddToStage, this);
    }

    /**
     * 显示对象.hitTestPoint(x, y, 是否使用像素检测) 用于像素碰撞检测
     * 与矩形碰撞检测相比, 像素碰撞检测只会检测显示对象显示部分与这个点是否碰撞
     * 而矩形碰撞检测是检测显示对象的包围圈是否和这个点碰撞, 像素碰撞检测消耗性能大
     * 如下绘制两个圆, 依次和他们的最小包围矩形的右下角的坐标做碰撞检测
     * 最小包围矩形 => 水平的能将整个图案包括在内的矩形
     * 可以发现, 矩形碰撞检测, 碰撞点只要在显示的对象的最小包围矩形内, 就返回 true
     * 而像素碰撞检测, 碰撞点只有在园内的, 即显示区域内, 才返回 true
     */
    private onAddToStage(event: egret.Event) {
        var shp1:egret.Shape = new egret.Shape();
        shp1.graphics.beginFill( 0xff0000 );
        shp1.graphics.drawCircle( 50,50,50);
        shp1.graphics.endFill();
        this.addChild(shp1);

        var shp2:egret.Shape = new egret.Shape();
        shp2.graphics.beginFill( 0xff0000 );
        shp2.graphics.drawCircle( 50,450,50);
        shp2.graphics.endFill();
        this.addChild(shp2);

        var isHit0:boolean = shp1.hitTestPoint(100, 100);
        var isHit1:boolean = shp2.hitTestPoint(100, 500, true);

        var infoText:egret.TextField = new egret.TextField();
        infoText.y = 200;
        infoText.text = "isHit0: " + isHit0 + ", isHit1: " + isHit1;
        this.addChild(infoText);
    }
}

 

转载于:https://www.cnblogs.com/lovling/p/8403837.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值