一种基于像素的顶层对象检测及鼠标事件检测方法和装置转让专利

申请号 : CN200910091470.2

文献号 : CN101630254B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 黄朝兴

申请人 : 腾讯科技(深圳)有限公司

摘要 :

本发明公开了一种基于像素的顶层对象检测方法,包括:获取所有目标显示对象像素点的数组,并设置基本变量;遍历数组中的每个显示对象像素点,确定显示对象当前像素点是否为透明。本发明还同时公开了一种基于像素的顶层对象检测装置、以及一种基于像素的鼠标事件检测方法和装置,采用本发明准确获取和识别基于像素的任意点目标显示对象,能对显示对象实现像素级的准确识别和处理。

权利要求 :

1.一种基于像素的顶层对象检测方法,其特征在于,该方法包括:

获取所有目标显示对象像素点的数组,并设置基本变量;

遍历数组中的每个显示对象像素点,在当前像素点显示对象为位图对象时,调用bitmapData.hitTest函数对当前像素点进行透明判决;在当前点像素显示对象为除位图对象和文本区域对象外其他不可识别的对象时,提取需判断的像素点,创建一个像素大小的位图数据缓冲区,根据偏移矩阵和像素绘制区域将目标对象中需要检测的像素点的像素值,绘制到创建好的一个像素大小的位图数据缓冲区中;检测缓冲区中像素的α值,并根据α值是否为零确定像素点是否透明。

2.根据权利要求1所述的顶层对象检测方法,其特征在于,所述基本变量包括偏移矩阵、像素绘制区域、位图缓存大小以及绘制区域的起始点;

所述设置基本变量为:将所述基本变量设置为成员变量。

3.根据权利要求1或2所述的顶层对象检测方法,其特征在于,所述根据α值是否为零确定当前像素点是否透明为:如果α值为零,则像素点透明;如果α值不为零,则像素点不透明。

4.一种基于像素的顶层对象检测装置,其特征在于,该装置包括初始化单元、像素点透明状态确定单元;其中,初始化单元,用于获取所有目标显示对象像素点的数组,并设置基本变量;

像素点透明状态确定单元,用于遍历数组中的每个显示对象像素点,在当前像素点显示对象为位图对象时,调用bitmapData.hitTest函数对当前像素点进行透明判决;在当前点像素显示对象为除位图对象和文本区域对象外其他不可识别的对象时,提取需判断的像素点,创建一个像素大小的位图数据缓冲区,根据偏移矩阵和像素绘制区域将目标对象中需要检测的像素点的像素值,绘制到创建好的一个像素大小的位图数据缓冲区中;检测缓冲区中像素的α值,并根据α值是否为零确定像素点是否透明。

5.根据权利要求4所述的顶层对象检测装置,其特征在于,所述像素点透明状态确定单元根据缓存的α值确定当前像素点是否透明为:如果α值为零,则像素点透明;如果α值不为零,则像素点不透明。

6.一种基于像素的鼠标事件检测方法,其特征在于,该方法包括:

监听舞台stage的鼠标事件;

侦听到鼠标事件后,获取鼠标点击点对应的显示对象;

由获取的显示对象产生对应的事件,并由事件处理函数处理所产生的鼠标事件;

其中,所述获取鼠标点击点对应的显示对象为获取确定透明或不透明属性的像素点显示对象,所述确定透明或不透明属性包括:获取所有目标显示对象像素点的数组,并设置基本变量;

遍历数组中的每个显示对象像素点,在当前像素点显示对象为位图对象时,调用bitmapData.hitTest函数对当前像素点进行透明判决;在当前点像素显示对象为除位图对象和文本区域对象外其他不可识别的对象时,提取需判断的像素点,创建一个像素大小的位图数据缓冲区,根据偏移矩阵和像素绘制区域将目标对象中需要检测的像素点的像素值,绘制到创建好的一个像素大小的位图数据缓冲区中;检测缓冲区中像素的α值,并根据α值是否为零确定像素点是否透明。

7.根据权利要求6所述的鼠标事件检测方法,其特征在于,所述根据α值是否为零确定当前像素点是否透明为:如果α值为零,则像素点透明;如果α值不为零,则像素点不透明。

8.一种基于像素的鼠标事件检测装置,其特征在于,该装置包括:鼠标事件监听单元、显示对象获取单元、事件产生及处理单元;其中,所述鼠标事件监听单元,用于监听舞台stage的鼠标事件;

所述显示对象获取单元,用于在侦听到鼠标事件后,获取鼠标点击点对应的显示对象;

所述事件产生及处理单元,由获取的显示对象产生对应的事件,并由事件处理函数处理所产生的鼠标事件;

其中,所述获取鼠标点击点对应的显示对象为获取确定透明或不透明属性的像素点显示对象,所述确定透明或不透明属性包括:获取所有目标显示对象像素点的数组,并设置基本变量;

所述显示对象获取单元还包括:初始化单元、像素点透明状态确定单元;所述初始化单元,用于获取所有目标显示对象像素点的数组,并设置基本变量;

所述像素点透明状态确定单元,用于遍历数组中的每个显示对象像素点,在当前像素点显示对象为位图对象时,调用bitmapData.hitTest函数对当前像素点进行透明判决;在当前点像素显示对象为除位图对象和文本区域对象外其他不可识别的对象时,提取需判断的像素点,创建一个像素大小的位图数据缓冲区,根据偏移矩阵和像素绘制区域将目标对象中需要检测的像素点的像素值,绘制到创建好的一个像素大小的位图数据缓冲区中;检测缓冲区中像素的α值,并根据α值是否为零确定像素点是否透明。

9.根据权利要求8所述的鼠标事件检测装置,其特征在于,所述像素点透明状态确定单元根据缓存的α值确定当前像素点是否透明为:如果α值为零,则像素点透明;如果α值不为零,则像素点不透明。

说明书 :

一种基于像素的顶层对象检测及鼠标事件检测方法和装置

技术领域

[0001] 本发明涉及第三代功能脚本(AS3,ActionScript)中的对象检测技术,特别是涉及一种基于像素的顶层对象检测方法和装置、以及基于像素的鼠标事件检测方法和装置。

背景技术

[0002] ActionScript是针对Adobe Flash Player运行时环境的编程语言,它在Flash内容和应用程序中实现了交互性、数据处理以及其它许多功能。ActionScript是由Flash Player中的ActionScript虚拟机(AVM)来执行的。
[0003] 随着ActionScript的不断发展,出现了第三代Flash脚本ActionScript 3.0,简称AS3,AS3的脚本编写功能超越了ActionScript的早期版本,旨在方便创建拥有大型数据集和面向对象的可重用代码库的高度复杂应用程序。
[0004] 目前在AS3中,目标对象是以矢量为基础的,位图在Flash中均被看作矩形来对待。也就是说,如果AS3用户欲采用位图作为显示对象(display object),那么,所有的位图都会被当作矩形来看,位图的透明区域也被认为是不透明的矩形,从而导致顶层对象不能准确地被识别。例如:假设当前的显示对象是在某实物前面放置一个铁环,那么,当点击铁环中心时,由于铁环中间部分是空的,即属于透明区域,实际顶层对象是铁环后面的实物,应该点击到实物,而现有技术将位图的透明区域也看作不透明的矩形,那么,点击铁环中心时不会认为点击到的顶层对象是实物,而会错误的识别顶层对象为铁环平面。
[0005] 同样,在AS3中,鼠标事件(MouseEvent)和鼠标位置是最重要的人机交互途径,其中,鼠标位置是指AS3鼠标坐标的总结。一般,当鼠标移动到目标对象之上时会触发鼠标事件;或鼠标在目标对象之上移动、按下、松开、转动滚轮时会触发鼠标事件。而现有鼠标事件系统中,所有的位图显示对象会被当作与位图大小相同的不透明的矩形区域处理,显示对象中透明镂空部分不会被穿透,这样就会导致对显示对象识别错误,从而产生错误的鼠标事件。

发明内容

[0006] 有鉴于此,本发明的主要目的在于提供一种基于像素的顶层对象检测方法和装置,能准确获取和识别基于像素的任意点目标显示对象。
[0007] 本发明进一步的目的在于提供一种基于像素的鼠标事件检测方法和装置,能对显示对象实现像素级的准确识别和处理。
[0008] 为达到上述目的,本发明的技术方案是这样实现的:
[0009] 本发明提供了一种基于像素的顶层对象检测方法,包括:
[0010] 获取所有目标显示对象像素点的数组,并设置基本变量;
[0011] 遍历数组中的每个显示对象像素点,在当前像素点显示对象为位图对象时,调用bitmapData.hitTest函数对当前像素点进行透明判决;在当前点像素显示对象为除位图对象和文本区域对象外其他不可识别的对象时,提取需判断的像素点,创建一个像素大小的位图数据缓冲区,根据偏移矩阵和像素绘制区域将目标对象中需要检测的像素点的像素值,绘制到创建好的一个像素大小的位图数据缓冲区中;检测缓冲区中像素的α值,并根据α值是否为零确定像素点是否透明。
[0012] 其中,所述基本变量包括偏移矩阵、像素绘制区域、位图缓存大小以及绘制区域的起始点;所述设置基本变量为:将所述基本变量设置为成员变量。
[0013] 上述方案中,所述根据α值是否为零确定当前像素点是否透明为:如果α值为零,则像素点透明;如果α值不为零,则像素点不透明。
[0014] 本发明还提供了一种基于像素的顶层对象检测装置,包括初始化单元、像素点透明状态确定单元;其中,
[0015] 初始化单元,用于获取所有目标显示对象像素点的数组,并设置基本变量;
[0016] 像素点透明状态确定单元,用于遍历数组中的每个显示对象像素点,在当前像素点显示对象为位图对象时,调用bitmapData.hitTest函数对当前像素点进行透明判决;在当前点像素显示对象为除位图对象和文本区域对象外其他不可识别的对象时,提取需判断的像素点,创建一个像素大小的位图数据缓冲区,根据偏移矩阵和像素绘制区域将目标对象中需要检测的像素点的像素值,绘制到创建好的一个像素大小的位图数据缓冲区中;检测缓冲区中像素的α值,并根据α值是否为零确定像素点是否透明。
[0017] 上述方案中,所述像素点透明状态确定单元根据缓存的α值确定当前像素点是否透明为:如果α值为零,则像素点透明;如果α值不为零,则像素点不透明。
[0018] 本发明又提供了一种基于像素的鼠标事件检测方法,包括:
[0019] 监听stage的鼠标事件;
[0020] 侦听到鼠标事件后,获取鼠标点击点对应的显示对象;
[0021] 由获取的显示对象产生对应的事件,并由事件处理函数处理所产生的鼠标事件;
[0022] 其中,所述获取鼠标点击点对应的显示对象为获取确定透明或不透明属性的像素点显示对象,所述确定透明或不透明属性包括:获取所有目标显示对象像素点的数组,并设置基本变量;
[0023] 遍历数组中的每个显示对象像素点,在当前像素点显示对象为位图对象时,调用bitmapData.hitTest函数对当前像素点进行透明判决;在当前点像素显示对象为除位图对象和文本区域对象外其他不可识别的对象时,提取需判断的像素点,创建一个像素大小的位图数据缓冲区,根据偏移矩阵和像素绘制区域将目标对象中需要检测的像素点的像素值,绘制到创建好的一个像素大小的位图数据缓冲区中;检测缓冲区中像素的α值,并根据α值是否为零确定像素点是否透明。
[0024] 本发明还提供了一种基于像素的鼠标事件检测装置,包括:鼠标事件监听单元、显示对象获取单元、事件产生及处理单元;其中,
[0025] 所述鼠标事件监听单元,用于监听stage的鼠标事件;
[0026] 所述显示对象获取单元,用于在侦听到鼠标事件后,获取鼠标点击点对应的显示对象;
[0027] 所述事件产生及处理单元,由获取的显示对象产生对应的事件,并由事件处理函数处理所产生的鼠标事件;
[0028] 其中,所述获取鼠标点击点对应的显示对象为获取确定透明或不透明属性的像素点显示对象,所述确定透明或不透明属性包括:获取所有目标显示对象像素点的数组,并设置基本变量;
[0029] 所述显示对象获取单元还包括:初始化单元、像素点透明状态确定单元;所述初始化单元,用于获取所有目标显示对象像素点的数组,并设置基本变量;
[0030] 所述像素点透明状态确定单元,用于遍历数组中的每个显示对象像素点,在当前像素点显示对象为位图对象时,调用bitmapData.hitTest函数对当前像素点进行透明判决;在当前点像素显示对象为除位图对象和文本区域对象外其他不可识别的对象时,提取需判断的像素点,创建一个像素大小的位图数据缓冲区,根据偏移矩阵和像素绘制区域将目标对象中需要检测的像素点的像素值,绘制到创建好的一个像素大小的位图数据缓冲区中;检测缓冲区中像素的α值,并根据α值是否为零确定像素点是否透明。
[0031] 本发明所提供的基于像素的顶层对象检测及鼠标事件检测方法和装置,将目标显示对象按像素点处理,分别确认每个像素点目标对象是否透明,如此,就可以高效地获得任意一点基于像素的目标显示对象,从而过滤掉位图中的透明区域,使位图中的透明区域不会再被作为不透明的矩形来处理,进而准确地识别顶层对象。
[0032] 进一步的,基于像素级检测,在鼠标事件系统中,所有的显示对象都会被当作像素级显示对象来处理,如此,能够准确地提取出目标点的最顶层不透明对象,准确完成2D图形引擎中基本的目标拾取功能,从而为Flash成为基于位图的2D图形引擎的目标选择提供了基础。

附图说明

[0033] 图1为本发明基于像素的顶层对象检测方法的实现流程示意图;
[0034] 图2为本发明基于像素的鼠标事件检测方法的实现流程示意图。

具体实施方式

[0035] 本发明的基本思想是:将目标显示对象按像素点处理,分别确认每个像素点显示对象是否透明,从而过滤掉位图中的透明区域,准确识别顶层对象。
[0036] 本发明基于像素的顶层对象检测方法如图1所示,包括以下步骤:
[0037] 步骤101:以像素点为单位,获取所有目标显示对象像素点的数组,并设置基本变量;
[0038] 这里,所述获取所有目标显示对象像素点的数组是指:获取目标显示对象的每个像素点,分别作为一个数组元素依次放置在数组中,具体如何获取像素点为已有技术,可采用var arr:Array=_theStage.getObjectsUnderPoint(stagePt)的方式获取,在此不再详述。
[0039] 这里,所述基本变量包括:偏移矩阵、像素绘制区域、位图缓存(buffer)大小以及绘制区域的起始点,具体可采用以下方式设置基本变量:
[0040] var_mat:Matrix=new Matrix;
[0041] var_rt:Rectangle=new Rectangle(0,0,1,1);
[0042] var_bitData:BitmapData=new BitmapData(_rt.width,_rt.height,true);
[0043] var_ptStart:Point=new Point;
[0044] 为了简化步骤,避免在多次实现时每次进行初始化,可将上述基本变量设置为成员变量,相应的,在函数实现时可直接作为一个类的成员函数实现。具体可采用以下方式设置为成员变量:
[0045] private var_mat:Matrix=new Matrix;
[0046] private var_rt:Rectangle=new Rectangle(0,0,1,1);
[0047] private var_bitData:BitmapData = newBitmapData(_rt.width,_rt.height,true);
[0048] private var_ptStart:Point=new Point;
[0049] 步骤102:从上到下遍历数组中的每个显示对象像素点,确定显示对象当前像素点是否为透明。
[0050] 这里,所述从上到下是指按数组下标的前后顺序从前向后,并且,数组下标顺序与显示对象从上到下的层次关系是对应的。
[0051] 具体如何确定当前像素点是否为透明可采用以下步骤:
[0052] 步骤102a:如果当前像素点显示对象是位图(bitmap)对象,则直接调用bitmapData.hitTest函数进行判断是否透明;
[0053] 这里,bitmapData.hitTest为已有函数,具有判断像素是否透明的功能。
[0054] 步骤102b:如果当前像素点显示对象是文本区域(TextField)对象,则直接认为是不透明;
[0055] 这里,由于TextField对象的绘制方法调用时会改变鼠标焦点,影响系统表现,所以直接确认为不透明,不进行绘制。
[0056] 步骤102c:如果当前像素点显示对象是其他对象,则提取需要判断的像素点进行绘制、比较,确定是否透明;
[0057] 这里,所述其他对象是指不可识别的对象;那么,相应的处理方式就是创建一个像素大小的位图数据bitmapdata,绘制一个像素,如此可大大提高效率。
[0058] 上述过程中,检测当前像素点显示对象属于哪种类型的对象具体是判断对应的数组元素的属性值,如:if(arr[i]is Bitmap)、if(arr[i]is TextField)等等,就是判断数组中第i个数组元素的属性值是否为位图对象或文本区域等。
[0059] 其中,具体的绘制、比较过程是这样:提取像素点,并创建一个像素大小的位图数据缓冲区,根据偏移矩阵和绘制区域将目标对象中需要检测的点的像素值,绘制到创建好的一个像素大小的位图数据缓冲区中;检测buffer中该像素的α值,确定当前像素点是否透明,如果α值为零,则像素点透明;如果α值不为零,则像素点不透明。这里,像素点的绘制区域、绘制区域的起始点以及位图buffer的大小均在设置基本变量时设置好。
[0060] 这里,可通过调用bitmapdata的方法,来实现将检测点的像素值绘制到位图数据缓冲区的操作,关键在于选择合适的偏移矩阵。
[0061] 例如:采用_bitData.draw(arr[i],_mat,null,null,_rt),表示将第i个数组元素的对象按照偏移矩阵_mat绘制一个像素的矩型区域_rt到buffer_bitData。
[0062] 为实现上述方法,本发明还提出了一种基于像素的顶层对象检测装置,包括初始化单元、像素点透明状态确定单元,其中,
[0063] 初始化单元,用于获取所有目标显示对象像素点的数组,并设置基本变量;
[0064] 像素点透明状态确定单元,用于遍历数组中的每个显示对象像素点,确定显示对象当前像素点是否为透明;
[0065] 进一步的,像素点透明状态确定单元包括:对象类型判别单元和处理单元;
[0066] 具体的,所述对象类型判别单元,用于确定当前像素点显示对象为位图对象、或文本区域对象、或其他对象,并将确定的对象类型送至处理单元;
[0067] 所述处理单元,用于接收对象类型判别单元发来的当前像素点显示对象的类型,在当前像素点显示对象为位图对象时,调用bitmapData.hitTest函数进行透明判决;在当前像素点显示对象为文本区域对象时,直接确定为不透明;在当前点像素显示对象为其他对象时,提取需判断的像素点进行绘制、比较,确定是否透明。
[0068] 当处理单元对当前点像素显示对象为其他对象的情况进行处理时,该处理单元可进一步包括:像素点提取单元、绘制位置计算单元、位图数据创建单元、像素点绘制单元以及像素点判别单元;其中,像素点提取单元,用于提取当前显示对象的像素点;绘制位置计算单元,用于根据偏移矩阵确定绘制位图的位置;位图数据创建单元,用于创建一个像素大小的位图数据;像素点绘制单元,用于将像素点绘制到该位图的buffer中;像素点判别单元,用于根据buffer的α值确定当前像素点是否透明。
[0069] 在上述基于像素的顶层对象检测方案的基础上,结合鼠标事件的检测,本发明又提出一种基于像素的鼠标事件检测方法,如图2所示,包括以下步骤:
[0070] 步骤201:监听舞台(stage)的鼠标事件;
[0071] 这里,所述鼠标事件包括但不限于:按下鼠标、释放鼠标、移动鼠标、鼠标进入显示对象、鼠标离开显示对象等等。
[0072] 步骤202:侦听到鼠标事件后,获取鼠标点击点对应的显示对象;
[0073] 这里,所述侦听到鼠标事件就是指检测到鼠标被按下、或鼠标被释放、或鼠标移动;所述获取鼠标点击点对应的显示对象为获取确定透明或不透明属性的像素点显示对象,所述确定像素点显示对象透明或不透明属性,就是利用图1所述的方法,包括:获取所有目标显示对象像素点的数组,并设置基本变量;遍历数组中的每个显示对象像素点,确定显示对象当前像素点是否透明。
[0074] 步骤203:由获取的显示对象产生对应的事件,并由事件处理函数处理所产生的鼠标事件。
[0075] 下面结合两个具体应用实例说明基于像素的鼠标事件检测方法的实现。
[0076] 应用实例一:普通鼠标事件检测的实现过程:
[0077] 步骤11:监听stage的鼠标事件,这里的鼠标事件为按下鼠标、释放鼠标、移动鼠标等等;
[0078] 步骤12:侦听到鼠标事件后,获取鼠标点击点对应的显示对象a;这里所述获取采用图1所示的方法获取相应的像素点显示对象;
[0079] 步骤13:显示对象a产生对应的事件;比如:鼠标被按下对应的事件为a.dispatchEvent(new MouseEvent(″downOnPixel″);
[0080] 步骤14:由事件处理函数处理所产生的鼠标事件。
[0081] 应用实例二:进入显示对象或离开显示对象的鼠标事件的实现过程:
[0082] 步骤21:监听stage的鼠标事件,同时启动定时器(timer)定时检测鼠标点下的对象;
[0083] 步骤22:侦听到timer事件或鼠标移动事件后,获取鼠标点的显示对象a;这里所述获取采用图1所示的方法获取相应的像素点显示对象;
[0084] 步骤23:如果当前显示对象与上一次的显示对象lasta不同,则对lasta产生鼠标离开事件lasta.dispatchEvent(new MouseEvent(″leaveOnPixel″),同时对显示对象a产生鼠标进入事件a.dispatchEvent(new MouseEvent(″enterOnPixel″),并保存显示对象a为上一次的显示对象lasta;
[0085] 步骤24:由事件处理函数处理所产生的鼠标事件。
[0086] 为实现所述的鼠标事件检测方法,本发明还提出一种基于像素的鼠标事件检测装置,包括:鼠标事件监听单元、显示对象获取单元、事件产生及处理单元;其中,[0087] 所述鼠标事件监听单元,用于监听stage的鼠标事件;
[0088] 所述显示对象获取单元,用于在侦听到鼠标事件后,获取鼠标点击点对应的显示对象;
[0089] 所述事件产生及处理单元,由显示对象产生对应的事件,并由事件处理函数处理所产生的鼠标事件。
[0090] 其中,所述显示对象获取单元实际就是基于像素的顶层对象检测装置,利用基于像素的顶层对象检测装置的组成和功能,完成鼠标点击点所对应显示对象的获取,得到具有透明或不透明属性的显示对象。
[0091] 以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。