`

另类像素级精确选择对象法—蓝图法

阅读更多

from:http://bbs.9ria.com/forum.php?mod=viewthread&tid=16763

 

另类像素级精确选择对象法—蓝图法

 

本方法主要是运用bitmapData以及ColorTransform类。
  实现原理是把“层深值”图像化然后根据鼠标当前像素颜色值去取对象。

  至于为什么叫蓝图法,原因是这张用来判断的图片显示的时候基本全是蓝和黑色,要出现其他颜色的话对象数量就必须达到一个巨大的量。所以在同一层级不上万个对象的情况下图片基本就是蓝黑色的。实际用的办法比较另类,也是属于一时

 

突发奇想的结果。

判断对象主要分三种情况
1、全静态显示对象处理
2、动态显示对象处理
3、混合对象处理

 

一、全静态显示对象取得当前鼠标所在位置对象的过程如下:

正常版DEMO: 静态物体精确选择_正常版.swf
蓝图版DEMO: 静态物体精确选择_蓝图版.swf 

1、初始化对象。
2、建立对象索引表或者把需要判断的对象addChild到相应容器中。
3、创建一个蓝图的bitmapData尺寸是场景大小。
4、遍历某一层级容器下的显示列表比如stage的,前提是这个容器必须是DisplayObjectContainer子类。同时利用 ColorTransform类和DisplayObject对象的transform.colorTransform属性把对象设置成单色,颜色值等于 层深值。由于深度值在这个层级下肯定是唯一的,那么每个对象就变成了有唯一颜色的单色对象(完全透明区域不会变色,仍然保持完全透明)。
5、把单色对象按深度从小到大的顺序向蓝图bitmapData里draw(),draw()完再次设置DisplayObject对象的 transform.colorTransform属性为空把对象颜色恢复正常。最终循环完成的时一张蓝黑色的图片也就是蓝图就生成了。
6、生成的蓝图并不需要显示或者addChild到任何地方存在即可。
7、用enterFrame或者鼠标事件或者setInterval来作为触发来获得当前鼠标的X,Y坐标。
8、用bitmapData的getPixel(x,y)方法从蓝图中获取相应坐标的颜色值,也就是获得当前鼠标下那点的蓝图颜色。而这个颜色就是一个深度,那么直接stage.getChildAt()就可以方便的返回这个深度的对象了。

  全静态的蓝图只需要制作一次,因为里面的视觉元素根本不会变化。如果场景平移那么蓝图也相应平移即可。所以比较 消耗资源的就是初始化的时候,之后由于只调用了getPixel()和getChildAt()可以说速度相当优异(100000次循环在100毫秒以 内,那么单次大概0.001毫秒以下)。

二、动态对象获取

 

DEMO: 动态物体精确选择.swf 

 

基本原理和静态的相同,但是由于待选对象是运动的可能是动画可能是复杂移动,那么蓝图只做一次明显就无法满足。那么就需要随时刷新蓝图,但是如果对象过多 明显draw()这个占资源的东西会造成太多的系统消耗。那么我们就不要去把所有动态对象做进蓝图,只需要把鼠标点所在的那个点下的动态对象做成蓝图并取 色即可。
  这里获取当前点下的目标列表可以使用stage.getObjectsUnderPoint(point)方法。而获得对象深度值则使用getChildIndex(dislplayObject)来取得唯一颜色值。
  在触发判断的瞬间把列表中的对象变色并且取得鼠标坐标点颜色然后再把对象变回去。由于过程很快实际显示上不会有任何影响。

三、混合对象处理
  比如游戏场景中的房屋街道家具树木这些都是静态对象,而玩家敌人宠物或者一些场景动画就属于动态对象。混合处理就是把静态的做静态蓝图,再在对动态对 象获取的时候把静态对象从列表中排除。检测结果如果没有任何动态对象被选中再检测静态对象,毕竟静态对象只需要获取一次颜色就可以直接返回对象。

 

DEMO源代码: 像素级精确选择.rar

 

 

 

  • 大小: 68.6 KB
分享到:
评论

相关推荐

    像素工厂3_test_

    should upload 5 codes/documents files)(Pay online to activate your account)

    高级蓝图规划模版

    蓝图规划从项目启动内容、流程诊断、流程优化、流程实现、流程保障等方面进行了全面的说明,全面反映企业蓝图规划内容,并分类说明。

    UE4游戏编程蓝图c++语言教程

    虚幻引擎为您提供了多个...蓝图更直观,更具体地针对更高级的游戏编程:您通过将表示事件、控制结构和函数调用的图形节点串在一起来编写代码,并通过编辑内对话来定义您的数据和界面,而不必使用精确的语法写出定义。

    UE4离线蓝图API

    蓝图可视化脚本,离线API,蓝图节点查询工具,蓝图学习必备工具

    蓝图曲线.rar

    彩色复印机加载此icc文件以后,可以直接打印蓝图。

    SAP业务蓝图理解供应链管理

    SAP业务蓝图理解供应链管理 SAP业务蓝图理解供应链管理 SAP业务蓝图理解供应链管理 SAP业务蓝图理解供应链管理 SAP业务蓝图理解供应链管理

    金蝶K3-ERP总体业务蓝图

    金蝶K3 ERP总体业务蓝图是用Visio制作的流程图,描述公司ERP整体业务流程

    排序小程序蓝图模型

    排序小程序的Java蓝图,解压后双击index.html即可打开

    Python 蓝图

    首先,我对蓝图的理解相对通俗,就是觉得蓝图对于视图方法模块化、大项目协同开发过程中的一个很好的工具. 1.下图是我们通常情况下使用的项目组织结构 看一下视图方法: #views.py 1 from app import app 2 3 ...

    软件蓝图设计-模板.pdf

    软件蓝图设计-模板.pdf

    虚幻4蓝图艺术大师I

    虚幻4蓝图艺术大师I,中文版 pdf unreal engine,找了很久找到,分享下

    UE4蓝图入门思维导图

    UE4蓝图入门

    APS系统设计蓝图与方案.pptx

    APS系统设计蓝图与方案,针对需求、计划、生产排程都有详细的设计与解决方案

    UE4蓝图调用C++函数的工程分享

    1. 继承C++类的蓝图类直接调用 2.C++类中的全局函数,任意蓝图都能调用的方式。

    XXXX公司信息化高级业务蓝图诊断汇报稿.pptx

    问题梳理 ...优化成本核算方法、核算对象、核算科目、核算流程、成本分析报表 信息系统实施充分必要条件与风险评估 评估实施信息系统的充分必要条件及可能存在的风险 针对评估的风险提出应对措施

    像素

    然后选择gh-pages分支。 等待几分钟,Github将部署包含该存储库内容的新网站。 该网站的地址在“ GitHub页面”部分中可见。 点击链接。 您应该在地图上直接重定向到WorkAdventure! 自定义地图 您的地图现已启动...

    香港智慧城巿蓝图2.0

    香港智慧城巿蓝图2.0,精品一级

Global site tag (gtag.js) - Google Analytics