遊戲中實現物體的精確選擇

最簡單也是最高效的方法:
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.
使用方法:比如要找鼠標下面是否有一個BaseSprite的類的實例,這個類在game包裏面
SelectObject (mc,mouseX,mouseY,"game.BaseSprite")//注意要寫類的全路徑
發佈了52 篇原創文章 · 獲贊 161 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章