BitmapData オブジェクトが BitmapData オブジェクトによって完全に隠されているかどうかを確認しようとしています。hitTest 関数のようなものはありますが、どのピクセルでもなく、すべてのピクセルが確実にカバーされるようにしますか?
編集: オブジェクトが隠されているかどうかを確認するときに、透明なピクセルが含まれていないことが重要です。
BitmapData オブジェクトが BitmapData オブジェクトによって完全に隠されているかどうかを確認しようとしています。hitTest 関数のようなものはありますが、どのピクセルでもなく、すべてのピクセルが確実にカバーされるようにしますか?
編集: オブジェクトが隠されているかどうかを確認するときに、透明なピクセルが含まれていないことが重要です。
結局のところ、それは実際には非常に単純な解決策です! 基本的に、オーバーラップしたビットマップが占める長方形の領域で、オーバーラップしたビットマップのピクセル値をキャプチャするだけです。次に、その値のベクトルを反復処理し、0 (完全に透明なピクセル) がない限り、その下のビットマップを完全に覆います。
このテストで使用した 2 つのビットマップを次に示します。
ビットマップの重複:
重複したビットマップ:
コード:
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.utils.ByteArray;
import flash.geom.Rectangle;
var coveredBitmapData:BitmapData = new CoveredBitmapData();
var coveringBitmapData:BitmapData = new CoveringBitmapData();
var coveringBitmap:Bitmap = new Bitmap(coveringBitmapData, "auto", true);
var coveredBitmap:Bitmap = new Bitmap(coveredBitmapData, "auto", true);
coveredBitmap.x = Math.random() * (stage.stageWidth - coveredBitmap.width);
coveredBitmap.y = Math.random() * (stage.stageHeight - coveredBitmap.height);
stage.addChild(coveredBitmap);
stage.addChild(coveringBitmap);
stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMovement);
function onMouseMovement(e:MouseEvent):void
{
coveringBitmap.x = mouseX - (coveringBitmap.width * .5);
coveringBitmap.y = mouseY - (coveringBitmap.height * .5);
checkIfCovering(coveringBitmap, coveredBitmap);
}
function checkIfCovering(bitmapA:Bitmap, bitmapB:Bitmap):Boolean
{
//bitmapA is the covering bitmap, bitmapB is the bitmap being overlapped
var overlappedBitmapOrigin:Point = new Point(bitmapB.x, bitmapB.y);
var localOverlappedBitmapOrigin:Point = bitmapA.globalToLocal(overlappedBitmapOrigin);
var overlappingPixels:Vector.<uint> = bitmapA.bitmapData.getVector(new Rectangle(localOverlappedBitmapOrigin.x, localOverlappedBitmapOrigin.y, bitmapB.width, bitmapB.height));
if(overlappingPixels.length == 0) {
//This means that there is no bitmap data in the rectangle we tried to capture. So we are not at all covering the underlying bitmap.
return false;
}
var i:uint = 0;
for(i; i < overlappingPixels.length; ++i) {
if(overlappingPixels[i] == 0) {
return false;
}
}
return true;
}
では、 (両方のビットマップ)object2
が完全にカバーされているかどうかを確認したいですか?object1
var left:Boolean = object2.x <= object1.x;
var top:Boolean = object2.y <= object1.y;
var right:Boolean = object2.x + object2.width >= object1.x + object1.width;
var bottom:Boolean = object2.y + object2.height >= object1.y + object1.height;
if(left && right && top && bottom)
{
// Completely covered.
}