2010-06-13 73 views
1

我創建了一個精靈來拖放舞臺。精靈被蒙上了屏幕,並且它的面具是小孩子,因此它也會隨精靈一起拖動。一切正常,直到我添加陰影過濾器的精靈。當添加投影時,如果鼠標事件發生在精靈原始位置並添加到舞臺上時,我只能用鼠標拖動鼠標並拖動精靈。ActionScript使用蒙版和過濾器拖放顯示對象?

我該如何解決這個問題?這可能是10.1的問題嗎?如果不是我做錯了什麼?

var thumbMask:Sprite = new Sprite(); 
thumbMask.graphics.beginFill(0, 1); 
thumbMask.graphics.drawRoundRect(0, 0, 100, 75, 25, 25); 
thumbMask.graphics.endFill(); 

var thumb:Sprite = new Sprite(); 
thumb.graphics.beginFill(0x0000FF, 1); 
thumb.graphics.drawRect(0, 0, 100, 75); 
thumb.graphics.endFill(); 

thumb.addEventListener(MouseEvent.MOUSE_DOWN, drag); 
thumb.addEventListener(MouseEvent.MOUSE_UP, drop); 

thumb.filters = [new DropShadowFilter(0, 0, 0, 1, 20, 20, 1.0, 3)]; 

thumb.addChild(thumbMask); 
thumb.mask = thumbMask; 
addChild(thumb) 

function drag(evt:MouseEvent):void 
    { 
    evt.target.startDrag(); 
    trace("drag"); 
    } 

function drop(evt:MouseEvent):void 
    { 
    evt.target.stopDrag(); 
    trace("drop"); 
    } 

---------------- 更新的解決方案 ----------------

感謝根據二進制的建議,問題可以通過使用cacheAsBitmap來解決。然而,當我將cacheAsBitmap應用到容器上時,容器中已經放置了已經應用了陰影的蒙版拇指精靈,但鼠標事件並沒有如預期的那麼好。閱讀文檔後,我才知道,添加一個過濾器,一個精靈會自動激活該精靈cacheAsBitmap屬性:

cacheAsBitmap屬性就 自動設置爲true時,你 應用濾鏡對顯示對象 (當其過濾器陣列不爲空時), 並且如果顯示對象具有應用於其的過濾器 ,則即使將屬性 設置爲false,cacheAsBitmap也會被報告爲 對象爲 對象。如果清除顯示對象 的所有過濾器,則cacheAsBitmap 將設置更改爲上次 設置的更改。 1

所以我相信這個錯誤是由相同的容器精靈中有2個cacheAsBitmap屬性造成的。因此,在這種情況下,我只是將過濾器添加到容器中,而不是添加到蒙版的拇指精靈。

var thumbMask:Sprite = new Sprite(); 
thumbMask.graphics.beginFill(0, 1); 
thumbMask.graphics.drawRoundRect(0, 0, 100, 75, 25, 25); 
thumbMask.graphics.endFill(); 

var thumb:Sprite = new Sprite(); 
thumb.graphics.beginFill(0x0000FF, 1); 
thumb.graphics.drawRect(0, 0, 100, 75); 
thumb.graphics.endFill(); 

thumb.addChild(thumbMask); 
thumb.mask = thumbMask; 

var container: Sprite = new Sprite(); 
container.addChild(thumb); 
container.filters = [new DropShadowFilter(0, 0, 0, 1, 20, 20, 1.0, 3)]; 

//if there is no filters applied or if the filters array is empty, use: 
//container.cacheAsBitmap = true; 

addChild(container); 

container.addEventListener(MouseEvent.MOUSE_DOWN, drag); 
container.addEventListener(MouseEvent.MOUSE_UP, drop); 

function drag(evt:MouseEvent):void 
    { 
    evt.target.startDrag(); 
    trace("drag"); 
    } 

function drop(evt:MouseEvent):void 
    { 
    evt.target.stopDrag(); 
    trace("--DROP"); 
    } 
+0

雖然這仍然是一個未解之謎,我設法一起解決了一個解決方案。我做的是從拖動的蒙面精靈中移除陰影。我創建了一個相同大小的精靈,並將它放置在顯示列表上的可拖動的蒙版精靈下面。我已經將陰影添加到了這個新圖層,而不是蒙版精靈。新的投影層通過爲每個MOUSE_DOWN和MOUSE_UP分別添加和刪除Event.ENTER_FRAME來跟蹤被遮罩的精靈。此輸入框架事件將調用一個新的函數,該函數將遮罩的Sprite和新的投影影子精靈對齊。 – TheDarkIn1978 2010-06-13 12:17:14

回答

1

你也可以通過將你的thumb剪輯包裝到容器中來解決這個問題。 設置cacheAsBitmaptrue並調整事件處理。

thumb.filters = [new DropShadowFilter(0, 0, 0, 1, 20, 20, 1.0, 3)]; 

// thumb.addEventListener(MouseEvent.MOUSE_DOWN, drag); 
// thumb.addEventListener(MouseEvent.MOUSE_UP, drop); 

var cont: Sprite = new Sprite(); 
    cont.addChild(thumb); 
    cont.cacheAsBitmap = true; 
    cont.addEventListener(MouseEvent.MOUSE_DOWN, drag); 
    cont.addEventListener(MouseEvent.MOUSE_UP, drop); 

    addChild(cont); 

因此,也許你不必爲你的陰影處理第二個精靈。 希望這會有所幫助.. 關於..

+0

好吧,我得到它的工作。謝謝。我已經使用你的建議更新了工作代碼。這是一個比我的黑客更好的解決方案。 – TheDarkIn1978 2010-06-15 14:19:49

+0

哦,我剛發現一個問題。似乎並非所有包含的精靈都在調用鼠標按下事件。即掩蔽矩形的下部和右部。 – TheDarkIn1978 2010-06-15 14:29:59

+0

啊,我明白了。問題在於投影。 from the documentation:「只要將過濾器應用於顯示對象(過濾器數組不爲空),並且顯示對象應用了過濾器,cacheAsBitmap將自動設置爲true,則會將cacheAsBitmap報告爲對於該顯示對象,即使將該屬性設置爲false,也是如此。如果清除顯示對象的所有過濾器,則cacheAsBitmap設置將更改爲上次設置的內容。 我已經更新了我的代碼以顯示工作解決方案幷包含了這個探索。 – TheDarkIn1978 2010-06-15 14:45:33