游戏中实现物体的精确选择

最简单也是最高效的方法:
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")//注意要写类的全路径
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值