オブジェクトの重なり判定

| comment (0) | trackback (0)

ドラッグしているオブジェクトが目的の場所にドロップできているかを判断するときなど、オブジェクト同士の重なりを判定をしたい場合があります。

Rectangle オブジェクトを使って、比較したいオブジェクトの矩形範囲を取得し、重なり合う部分があるか、あるいは一方のオブジェクトの中に完全に入っているかどうかを調べることができます。
Rectangle オブジェクトは、単に矩形領域を定義するだけです。Rectangle オブジェクトには、位置(左上隅の x 座標と y 座標で定義される)と、width プロパティ、height プロパティがあります。

2 つの矩形領域に重なり合う部分があるかどうかを調べるには、Rectangle.intersects() メソッドを使用します。

Rectangle.intersects(rect:Rectangle):Boolean
rect パラメータで指定されたオブジェクトがこの Rectangle オブジェクトと交差するかどうかを判別します。
パラメータ:
  rect:Rectangle   この Rectangle オブジェクトと比較する Rectangle オブジェクト
戻り値:
  指定されたオブジェクトがこの Rectangle オブジェクトと交差する場合は true を返します。
  交差しない場合は false を返します。

次の例は、ステージに配置されている MovieClip のインスタンスである mc1 、mc2 が重なりあっているかどうかを判定します。

var mc1Bounds:Rectangle = mc1.getBounds(stage);
var mc2Bounds:Rectangle = mc2.getBounds(stage);

if (mc1Bounds.intersects(mc2Bounds)) {
	trace("intersect");
}

一方の矩形領域がもう一方の矩形領域に完全に含まれるかどうかを調べるには、Rectangle.containsRect() メソッドを使用します。

Rectangle.containsRect(rect:Rectangle):Boolean
rect パラメータで指定された Rectangle オブジェクトがこの Rectangle オブジェクト内にあるか(オブジェクトの境界内に完全に収まる)どうかを判別します。
パラメータ:
  rect:Rectangle   この Rectangle オブジェクトと比較する Rectangle オブジェクト
戻り値:
  指定した Rectangle オブジェクトがこの Rectangle オブジェクトに含まれる場合は true を返します。
  含まれない場合は false を返します。

次の例は、ステージに配置されている MovieClip のインスタンスである mc1 に mc2 が完全に含まれているかどうかを判定します。

var mc1Bounds:Rectangle = mc1.getBounds(stage);
var mc2Bounds:Rectangle = mc2.getBounds(stage);

if (mc1Bounds.containsRect(mc2Bounds)) {
	trace("contain");
}

次の例は、ドロップした Sprite オブジェクト item_mc が Sprite オブジェクト frame_mc に重なっているか、あるいは完全に含まれているかを判定します。

var item_mc:Sprite = new Sprite();
item_mc.x = 20;
item_mc.y = 20;

item_mc.graphics.beginFill(0xff0000);
item_mc.graphics.moveTo(0, 0);
item_mc.graphics.lineTo(100, 0);
item_mc.graphics.lineTo(100, 100);
item_mc.graphics.lineTo(0, 100);
item_mc.graphics.endFill();

var frame_mc:Sprite = new Sprite();
frame_mc.x = 200;
frame_mc.y = 50;


frame_mc.graphics.beginFill(0x000000);
frame_mc.graphics.moveTo(0, 0);
frame_mc.graphics.lineTo(300, 0);
frame_mc.graphics.lineTo(300, 300);
frame_mc.graphics.lineTo(0, 300);
frame_mc.graphics.endFill();

addChild(frame_mc);
addChild(item_mc);


item_mc.addEventListener (MouseEvent.MOUSE_DOWN, onStartDrag);

function onStartDrag (eventObj:MouseEvent):void {
	item_mc.startDrag (false);
	stage.addEventListener (MouseEvent.MOUSE_UP, onStopDrag);
}

function onStopDrag (eventObj:MouseEvent):void {
	item_mc.stopDrag ();
	collisionDetect ();
}

function collisionDetect ():void {
	var frameBounds:Rectangle = frame_mc.getBounds(stage);
	var itemBounds:Rectangle = item_mc.getBounds(stage);

	if (frameBounds.containsRect(itemBounds)) {
		trace("contains!");
	}

	if (frameBounds.intersects(itemBounds)) {
		trace("intersects!");
	}
}

trackback (0)

trackback URL: http://gelsol.sub.jp/core/mt-tb.cgi/57

Post your comment