2012-04-30 2 views
1

Я ищу, чтобы проверить, полностью ли объект BitmapData полностью затенен объектом BitmapData. Есть ли что-то вроде функции hitTest, но это гарантирует, что каждый пиксель будет покрыт вместо любого пикселя?AS3 - Проверьте, полностью ли скрыт BitmapData другим BitmapData

Редактирование: важно, чтобы прозрачные пиксели не включались при проверке, если объект закрыт.

ответ

5

На самом деле это довольно простое решение! В основном то, что вы делаете, - это просто захватить значения пикселей перекрывающегося растрового изображения в области прямоугольника, которые занимает перекрываемое растровое изображение. Затем вы перебираете этот вектор значений и до тех пор, пока у вас нет 0 (полностью прозрачный пиксель), тогда вы полностью покрыли растровое изображение снизу.

Вот два растровых изображений, которые я использовал в этом тесте:

Перекрытие растровый:
enter image description here

Overlapped растровый:
enter image description here
Код:

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; 
} 
+0

'+ 1' Очень приятно. – Marty

+0

спасибо, сэр спасибо \ * берет лук \ * –

+0

Интересно, код также заботится о пикселях, которые говорят, что 50% прозрачные, или 25% прозрачные и т. Д.? Сглаживание растрового изображения обычно имеет такие пиксели. Что с ними? –

3

Итак, вы хотите узнать, полностью ли покрывает object2object1 (оба растровые изображения)?

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. 
} 
+0

+1, но что в случае, если покрытие имеет растровое изображение с альфа-каналом wi го полностью прозрачных пикселей? : O Я думаю, вам нужно рисовать как растровые изображения, так и третье растровое изображение, а также делать некоторые обводнения и пиксельные выборки, или копировать альфа-канал покрывающего растрового изображения во второй и проверять, остались ли какие-либо исходные пиксели? –

+1

Я забыл упомянуть о важности случая прозрачных пикселей. – Anonymous1

+0

@ Anonymous1 Вы говорите, что важно знать, делают ли прозрачные пиксели или не покрывают второе растровое изображение, или вы говорите, что вам все равно, будут ли границы объекта растрового изображения покрывать границы второго растрового изображения? –

Смежные вопросы