游戏中实现物体的精确选择
来源:互联网 发布:png编辑软件 编辑:程序博客网 时间:2024/06/15 08:34
最简单也是最高效的方法:
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")//注意要写类的全路径
0 0
- 游戏中实现物体的精确选择
- 游戏中实现物体的精确选择
- 游戏中实现物体的精确选择
- 游戏中实现物体的精确选择(转)
- 游戏引擎中物体的组织
- 控制游戏中物体的移动速度
- 控制游戏中物体的移动速度
- 游戏引擎中物体的组织
- Java中实现小数的精确计算
- OpenGL中三位物体的透明实现
- unity3d 中实现物体的移动
- Unity中物体抛物线的实现方式
- Unity中物体抛物线的实现
- Unity中物体抛物线的实现方式
- [Unity3D]Unity3D游戏开发之在3D场景中选择物体并显示轮廓效果
- Unity3D游戏开发之在3D场景中选择物体并显示轮廓效果
- 手指触摸旋转游戏物体和放大物体的代码实现
- Unity中UI和游戏物体之间的层级渲染
- UVa 10115 自动编辑
- Flex4 内部构建错误
- 【备战蓝桥杯】USACO--> Milking Cows[2]
- C指针原理(79)-递归(3)
- VS中删除一行CTRL+L 和delete的区别
- 游戏中实现物体的精确选择
- Shell学习(2)——shell变量(一)
- 急急急急急急 急!
- android dip dp px sp
- 最近的一点点感悟。
- 教程分享:Android开发中3种实现定时器的方法
- OOP(面向对象编程) 和 OPP(面向过程编程) 的异同点及系统总结
- 精简代码,为网站减负的十大建议
- (六)struts2- 2.3.15.3 spring3.2.4 mybatis-3.2.3 jquery.validationEngine ajax表单验证 数据库重复