最簡單也是最高效的方法:
1. 製作flash動畫的時候,在Flash CS裏面把圖片的alpha 通道刪除掉, 這樣就只有 圖像區域響應MouseOut,MouseOver事件,透明區域不響應。
具體方法:選中圖片->分離 取消選中 工具面板->套索->魔術棒 設置爲:"像素",閥值:"0" 點一下透明地方然後按del鍵
2. 下面這種方法適合 採用序列幀圖片生成動畫的方式, 因爲這種方式不能去掉alpha通道, 透明區域也會觸發MouseOut,MouseOver, 及hitTest爲ture:
遊戲中的人物很多都是用png位圖來做的,有的時候想讓人物能夠接收一些鼠標事件,必須用到精確選取。
這種精確的選取至少需要兩個功能。
第一:不能受到png透明區域的干擾。比如玩家A的位圖的透明區域和玩家B的不透明區域重疊,A在上面。鼠標點擊的時候應該選中B,而不是A
第二:必須返回這個位圖所在的正確的類容器。理解起來比較複雜。簡單的來說比如有個人物類叫human,他在初始化的時候通過類中的一個Loader
對象加載一個位圖。那應該返回的是這個類human的引用。
public static function SelectObject (contain:DisplayObject,mousex:Number,mousey:Number,classname:String):*
{
var arr=contain.stage.getObjectsUnderPoint(new Point(mousex,mousey));//取得容器中鼠標處的對象數組
for(var i=0;i<arr.length;i++)
for (var i=arr.length-1; i>=0; i--)//從上至下比較
{
var bitmapData:BitmapData = new BitmapData(arr[i].width, arr[i].height,true,0);//定義一個位圖數據對象準備拷貝數組中的顯示對象
bitmapData.draw (arr[i]);//複製一個顯示對象
if (bitmapData.getPixel32 (arr[i].mouseX,arr[i].mouseY)!=0)//如果不是透明的則表示這個對象是你選擇的。
{
bitmapData.dispose ();//清空位圖
if(arr[i] is (getDefinitionByName(classname) as Class))//選擇的物體就是自己本身
return arr[i];
var j=1;//做一個循環數
while(arr[i].parent!=null)//向上找到正確的容器,循環10次找不到就返回null
{
arr[i]=arr[i].parent;
if(arr[i] is (getDefinitionByName(classname) as Class))//如果與你寫的容器類型一致表示當前引用正確
{
return arr[i];
}
j++;
if(j>10||i==0)
return null;
}
}
}
}
原理:通過getObjectUnderPoint取得鼠標點下面所有的物體,然後從上往下判斷,如果該點的位置不是透明的就向上找父級有沒有你所要找的。
然後設定幾個判斷條件直到找到正確的引用或者返回null.
這種精確的選取至少需要兩個功能。
第一:不能受到png透明區域的干擾。比如玩家A的位圖的透明區域和玩家B的不透明區域重疊,A在上面。鼠標點擊的時候應該選中B,而不是A
第二:必須返回這個位圖所在的正確的類容器。理解起來比較複雜。簡單的來說比如有個人物類叫human,他在初始化的時候通過類中的一個Loader
對象加載一個位圖。那應該返回的是這個類human的引用。
public static function SelectObject (contain:DisplayObject,mousex:Number,mousey:Number,classname:String):*
{
var arr=contain.stage.getObjectsUnderPoint(new Point(mousex,mousey));//取得容器中鼠標處的對象數組
for(var i=0;i<arr.length;i++)
for (var i=arr.length-1; i>=0; i--)//從上至下比較
{
var bitmapData:BitmapData = new BitmapData(arr[i].width, arr[i].height,true,0);//定義一個位圖數據對象準備拷貝數組中的顯示對象
bitmapData.draw (arr[i]);//複製一個顯示對象
if (bitmapData.getPixel32 (arr[i].mouseX,arr[i].mouseY)!=0)//如果不是透明的則表示這個對象是你選擇的。
{
bitmapData.dispose ();//清空位圖
if(arr[i] is (getDefinitionByName(classname) as Class))//選擇的物體就是自己本身
return arr[i];
var j=1;//做一個循環數
while(arr[i].parent!=null)//向上找到正確的容器,循環10次找不到就返回null
{
arr[i]=arr[i].parent;
if(arr[i] is (getDefinitionByName(classname) as Class))//如果與你寫的容器類型一致表示當前引用正確
{
return arr[i];
}
j++;
if(j>10||i==0)
return null;
}
}
}
}
原理:通過getObjectUnderPoint取得鼠標點下面所有的物體,然後從上往下判斷,如果該點的位置不是透明的就向上找父級有沒有你所要找的。
然後設定幾個判斷條件直到找到正確的引用或者返回null.
使用方法:比如要找鼠標下面是否有一個BaseSprite的類的實例,這個類在game包裏面
SelectObject (mc,mouseX,mouseY,"game.BaseSprite")//注意要寫類的全路徑
SelectObject (mc,mouseX,mouseY,"game.BaseSprite")//注意要寫類的全路徑