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