2015-06-20 86 views
-1

我以爲我已經解決了我的mouseEvent問題,包含一個帶有alpha通道的位圖的精靈,但是我遇到了下圖中顯示的新問題:邊界框在「歐亞」地圖雪碧被觸發`MouseEvent.Roll_Out」爲‘非洲’雪碧防止透明位圖精靈的邊界框觸發鼠標事件

enter image description here

我的設置:每個地圖部分是與孩子的位圖雪碧(PNG阿爾法)和一個從位圖派生的「hitArea」精靈,相關的代碼如下:這很好用 - 除了有邊框重疊的情況。我附加到每個Sprite的eventListeners使用MouseEvent.ROLL_OVERMouseEvent.ROLL_OUT,但我也嘗試過MouseEvent.MOUSE_OVERMouseEvent.MOUSE_OUT

我已經嘗試將eventlisteners附加到「hitArea」Sprite和其他各種東西,但我無法使邊界框被忽略。有沒有我可能錯過的設置 - 或解決方法?


代碼:

buttonImage = new Bitmap(upImageData); 
buttonImage.smoothing = true; 
this.addChild(buttonImage); 
hitSprite = createHitArea(upImageData, 4); 
this.addChild(hitSprite); 
hitSprite.visible = false; 
hitSprite.mouseEnabled = false; 
this.hitArea = hitSprite; 

public function createHitArea(bitmapData:BitmapData, grainSize:uint=1):Sprite 
    { 
     var _hitarea:Sprite = new Sprite(); 
     _hitarea.graphics.beginFill(0x000000, 1.0);   
     for(var x:uint=0;x<bitmapData.width;x+=grainSize) { 
      for(var y:uint=grainSize;y<bitmapData.height;y+=grainSize) {      
       if(x<=bitmapData.width && y<=bitmapData.height && bitmapData.getPixel(x,y)!=0) { 
        _hitarea.graphics.drawRect(x,y,grainSize,grainSize); 
       }     
      } 
     }   
     _hitarea.graphics.endFill(); 
     _hitarea.cacheAsBitmap = true; 
     return _hitarea; 
    } 
+0

大多數人通過任何解決這個問題:一個**:** - 掩蔽與矢量蒙版剪輯(儘管對於可能由於形狀的複雜性而引起性能問題的地圖)或** b:在鼠標單擊處理程序上的**確定鼠標點下的像素是否透明。你可以使用方法A,但只是繪製一個簡單的矢量蒙版,接近地圖形狀,因爲它沒有矢量的複雜性。 – BadFeelingAboutThis

+0

謝謝 - 所以這是一個「已知問題」的東西?我以爲我是免費的,採用了位圖的方法,並且效果很好 - 除了這個邊界框問題。不能使用方法「a」:這些位圖是用戶在運行時從.psd文件導入的。我已經看到了「檢查像素」的方法演示 - 猜我會試一試。 –

+0

是的,鼠標偵聽器只使用邊界(除了矢量蒙版) – BadFeelingAboutThis

回答

1

如果使用矢量蒙版是不是一種可行的選擇,如果你改變了你的hitSpiteShape,然後由它(它應該工作地圖片精靈的面具 - 也不得不將其添加爲地圖片的兄弟,而不是孩子),那麼大多數人這樣做的方式是檢查是否鼠標下面的e像素是透明的或不透明的。

下面是一個例子:

比方說,你所有的地圖作品是雪碧的VAR引用的唯一的孩子叫container。我們還要爲這個例子做一個假設,即你的地圖片段是所有將png位圖作爲最底層孩子的Sprites。

您需要點擊監聽器添加到容器(而不是每個單獨的地圖部分):

container.addEventListener(MouseEvent.CLICK,click); 

function click(e:MouseEvent):void { 
    var child:Sprite; //a helper var to store the current iterations child below in the while loop 
    var target:Sprite; //the item that we determined was clicked 

    //iterate through all children of container (backwards, so we process the top most layer first) 
    var i:int = container.numChildren; 
    while(i--){ 
     child = container.getChildAt(i) as Sprite; //populate the child var 

     //now we check if the mouse is over this child by a simple hit test point 
     //we also then check if the pixel under the mouse is transparent (a value of 0) 
     if(child.hitTestPoint(e.stageX, e.stageY) && Bitmap(child.getChildAt(0)).bitmapData.getPixel32(child.x + e.localX,child.y + e.localY)){ 
      target = child; 
      break; //break out of the loop since we found a child that meets the criteria 
     } 
    } 

    trace(target); 

    //now do something with target 
}