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