最简单也是最高效的方法:
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")//注意要写类的全路径