2010-03-03 45 views
1

我已經創建了一個包含數據的位圖並將其放置在一個精靈中以便接收鼠標事件。然而,我正在努力閱讀精靈內的BitmapData。Actionscript從Sprite鼠標事件中檢索BitmapData

function showBitmapData(e:Event):void 
    { 
    var bData:BitmapData = new BitmapData(video.width, video.height); 
    bData.draw(video); 

    var bmap:Bitmap = new Bitmap(bData); 
    bmap.x = 220; 
    bmap.y = 20; 
    bmap.scaleX = bmap.scaleY = 2; 

    canvas = new Sprite; 
    addChild(canvas); 
    canvas.addChild(bmap); 

    //Mouse Track Pixel Colors 
    canvas.addEventListener(MouseEvent.CLICK, readPixel); 
    } 

function readPixel(e:MouseEvent):void 
    { 
    var hex:uint = e.bmap.bData.getPixel32(mouseX, mouseY); // <- is the problem? 
    var pixelAlpha:int = (hex >>> 0x18) & 0xff; 
    var red:int = (hex >>> 0x10) & 0xff; 
    var green:int = (hex >>> 0x08) & 0xff; 
    var blue:int = hex & 0xff; 

    colorText.text = "Red:" + red + " Green:" + green + " Blue:" + blue + " Alpha:" + pixelAlpha; 
    } 

回答

1

您正在嘗試讀取e領域bmap誰是MouseEvent並沒有這樣的領域。

此外Bitmap沒有名爲bData的字段,但是bitmapData。來從你的精靈位圖

一種方法是使用事件的目標,並使用getObjectsUnderPoint得到位圖(如果您有多個位圖到你的精靈)

而且不要忘了採取從BMAP鼠標座標,otherway你將與點轉換使用globalToLocalLocalToGlobal

// function to get the bitmap from a display object container 
// using the mouse coordinate 
function findBitmap(container:DisplayObjectContainer):Bitmap { 
if (container === null) 
    return null; 

var childs:Array = container.getObjectsUnderPoint(
    new Point(container.mouseX, container.mouseY) 
); 

while (childs.length > 0) { 
    var ret:Bitmap = childs.pop() as Bitmap; 
    if (ret !== null) 
    return ret; 
} 

return null; 
} 

// .... 
canvas = new Sprite; 
addChild(canvas); 
canvas.addChild(bmap); 
//Mouse Track Pixel Colors 
canvas.addEventListener(MouseEvent.CLICK, readPixel); 
// ... 

function readPixel(e:MouseEvent):void { 
    // found the bitmap from the currentTarget 
    var bmap:Bitmap=findBitmap(e.currentTarget as DisplayObjectContainer); 

    var hex:uint=0; 

    if (bmap!==null) { 
    hex = bmap.bitmapData.getPixel32(bmap.mouseX, bmap.mouseY); 
    } 

    var pixelAlpha:int = (hex >>> 0x18) & 0xff; 
    var red:int = (hex >>> 0x10) & 0xff; 
    var green:int = (hex >>> 0x08) & 0xff; 
    var blue:int = hex & 0xff; 

    colorText.text = 
     "Red:" + red + " Green:" + green + " Blue:" + blue + " Alpha:" + pixelAlpha; 
    } 
+0

e.currentTarget將是mc,而不是位圖。 – UltimateBrent 2010-03-03 23:01:25

+0

@UltimateBrent沒有,因爲我將事件添加到位圖,但無論如何,因爲位圖不是一個交互式對象,我不會得到事件,我會修改它。 – Patrick 2010-03-05 19:44:02

+0

謝謝帕特里克。完美的作品! – TheDarkIn1978 2010-03-05 21:01:23

0

的問題是,「E」是一個事件,它沒有一個BMAP屬性的發揮。它會有一個目標屬性,但這將是一個事件調度程序,在這種情況下,您的畫布。

我建議:

創建擴展精靈,幷包含位圖的自定義類。 創建該類的一個實例並將其添加到舞臺。 將您的事件偵聽器添加到該對象而不是舞臺。 在您的事件監聽器中檢查event.target是您的自定義類的實例。 如果是這樣,您可以使用事件的localX和localY來獲取對象的位圖屬性的像素值。

1

最簡單的方法是使您的位圖成爲畫布的屬性,以便從畫布中輕鬆地引用它。事件從畫布對象發射,所以e.target將成爲您的畫布。從那裏,你可以打你的位圖,位圖的bitmapData屬性將引用你的位圖數據。

function showBitmapData(e:Event):void 
    { 
    var bData:BitmapData = new BitmapData(video.width, video.height); 
    bData.draw(video); 

    var bmap:Bitmap = new Bitmap(bData); 
    bmap.x = 220; 
    bmap.y = 20; 
    bmap.scaleX = bmap.scaleY = 2; 

    canvas = new MovieClip(); //sprites can't have arbitrary properites 
    addChild(canvas); 
    canvas.bmap = bmap; //*** Look at me! I can be referenced later! 
    canvas.addChild(bmap); 

    //Mouse Track Pixel Colors 
    canvas.addEventListener(MouseEvent.CLICK, readPixel); 
    } 

function readPixel(e:MouseEvent):void 
    { 

    var hex:uint = e.target.bmap.bitmapData.getPixel32(mouseX, mouseY); // e.target is your "canvas" from before 
    var pixelAlpha:int = (hex >>> 0x18) & 0xff; 
    var red:int = (hex >>> 0x10) & 0xff; 
    var green:int = (hex >>> 0x08) & 0xff; 
    var blue:int = hex & 0xff; 

    colorText.text = "Red:" + red + " Green:" + green + " Blue:" + blue + " Alpha:" + pixelAlpha; 
    } 
+0

我明白你在說什麼。不幸的是,我似乎無法添加任何屬性到我的畫布精靈?! ReferenceError:錯誤#1056:無法在flash.display.Sprite上創建屬性bmap。 – TheDarkIn1978 2010-03-04 11:14:10

+0

另外,在我的AS3設置中,我打開了「自動聲明舞臺實例」。但它仍然不讓我添加該屬性。 – TheDarkIn1978 2010-03-04 11:42:24

+1

嘗試檢查bmap.name是否爲「bmap」。如果是這樣,你可以做'e.target.getChildByName('bmap')。bitmapData.getPix ...'而不是打擾這個屬性。如果不是,請設置名稱屬性。對不起,我很確定你可以在MC上設置任意屬性。 – UltimateBrent 2010-03-04 21:19:34