一种调用动画数据的方法及装置
技术领域
本发明涉及计算机技术领域,特别涉及一种调用动画数据的方法及装置。
背景技术
目前,Flash被广泛的用于网页设计和网页动画制作及网页视频播放等。大多数的视频网站包括直播网站都采用Flash做为其视频播放器,并且大多数的网页游戏也会使用Flash来开发,Flash的具体使用文件是SWF文件。绝大多数的Flash程序都是由多个SWF(Shock Wave Flash)文件来组成的,通常都是通过主SWF文件来加载其他的SWF文件,使用此方法的好处是,可以进行模块化开发,同时也可以对其他的SWF文件进行加密。比如对与游戏资源文件,通常会使用一个独立的SWF文件来存储,并且可以对独立的SWF文件进行加密,反止被HACK破解。而解密步骤都会在主SWF文件中。在主SWF文件中会有具体的接口来对数据进行解密。通常正常的使用SWF文件都是在主SWF的代码中来加载其他的SWF文件,并且将其加入到Flash显示的主舞台中,这样其他SWF文件才可以进行显示。而对于其他情况仅仅只是想调用另一个SWF文件中的一个方法,比如想调用主SWF文件中对其他SWF文件解密的方法,或者是想调用主SWF文件中数据打包等方法,则没有办法只调用其中一个接口。
发明内容
本发明实施例提供了一种调用动画数据的方法及装置,在不加载第三方动画到主舞台的情况下,直接去调用第三方动画文件的接口,实现动画数据的获取。
第一方面,本发明实施例中提供一种调用动画数据的方法,所述方法包括:
编写加载第三方的动画文件;
查找所述动画文件具有的类及接口;
获取需要的目标类并进行实例化,获取所述目标类的实例化对象及对应的接口;
调用所述实例化对象的接口获取所述动画文件中的动画数据。
进一步的,所述编写加载第三方的动画文件的步骤,具体包括:
定义一个动画文件加载实例;
注册动画文件加载完成的回调函数;
创建请求动画文件的接口;
调用所述接口加载所述动画文件;
编写所述回调函数。
进一步的,所述查找所述动画文件具有的类及接口的步骤,包括:
查找所述动画文件使用的符号,所述符号包括所有使用的包名,所有的类名,所有的函数名和变量名;
通过反编译工具读取所述使用的符号,确定所述动画文件具有的类及接口。
进一步的,所述获取需要的目标类并进行实例化,获取目标类的实例化对象的步骤,具体包括:
调用类判断接口判断是否存在需要的目标类;
若是,则调用类获取接口获取所述目标类;
根据所述目标类,创建所述目标类的实例化对象,确定所述实例化对象的接口。
进一步的,所述调用所述实例化对象的接口获取所述动画文件中的动画数据的步骤,具体包括:
获取所述目标类的目标接口,所述目标接口为用户需要获取动画数据的接口,所述目标接口具有用于存放加密前动画数据的数据参数;
调用所述实例化对象的目标接口获取所述数据参数。
第二方面,本发明实施例中提供一种调用动画数据的装置,所述装置包括:
编写单元,用于编写加载第三方的动画文件;
查找单元,用于查找所述动画文件具有的类及接口;
获取单元,用于获取需要的目标类并进行实例化,获取所述目标类的实例化对象及对应的接口;
调用单元,用于调用所述实例化对象的接口获取所述动画文件中的动画数据。
进一步的,所述编写单元具体用于:
定义一个动画文件加载实例;
注册动画文件加载完成的回调函数;
创建请求动画文件的接口;
调用所述接口加载所述动画文件;
编写所述回调函数。
进一步的,所述查找单元具体用于:
查找所述动画文件使用的符号,所述符号包括所有使用的包名,所有的类名,所有的函数名和变量名;
通过反编译工具读取所述使用的符号,确定所述动画文件具有的类及接口。
进一步的,所述获取单元具体用于:
调用类判断接口判断是否存在需要的目标类;
若是,则调用类获取接口获取所述目标类;
根据所述目标类,创建所述目标类的实例化对象,确定所述实例化对象的接口。
进一步的,所述调用单元具体用于:
获取所述目标类的目标接口,所述目标接口为用户需要获取动画数据的接口,所述目标接口具有用于存放加密前动画数据的数据参数;
调用所述实例化对象的目标接口获取所述数据参数。
本发明实施例中编写加载第三方的动画文件;查找动画文件具有的类及接口;获取需要的目标类并进行实例化,获取目标类的实例化对象及对应的接口;调用实例化对象的接口获取动画文件中的动画数据。本发明实施例中在不加载第三方动画到主舞台的情况下,直接去调用第三方动画文件的接口,实现动画数据的获取。
附图说明
图1是本发明实施例中调用动画数据的方法的一个实施例示意图;
图2为图1所示实施例中步骤S1的具体实施例流程示意图;
图3为图1所示实施例中步骤S2的具体实施例流程示意图;
图4为图1所示实施例中步骤S3的具体实施例流程示意图;
图5为图1所示实施例中步骤S4的具体实施例流程示意图;
图6是本发明实施例中调用动画数据的装置的一个实施例示意图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
本发明实施例中,调用动画数据的方法应用于调用动画数据的装置中,该装置可以位于终端中,例如移动终端或固定终端,具体的,可以是手机、平板等移动终端,或者服务器等固定终端设备中。
请参阅图1,本发明实施例中调用动画数据的方法一个实施例包括:
S1、编写加载第三方的动画文件;
本发明实施例中,第三方的动画文件可以是第三方的SWF文件。
S2、查找所述动画文件具有的类及接口;
由于动画文件的格式是公开的,以SWF文件为例,可以采取一些方式对SWF文件进行查找,知道这个SWF文件具有哪些类,保护哪些函数接口等。
S3、获取需要的目标类并进行实例化,获取所述目标类的实例化对象及对应的接口;
S4、调用所述实例化对象的接口获取所述动画文件中的动画数据。
本发明实施例中编写加载第三方的动画文件;查找动画文件具有的类及接口;获取需要的目标类并进行实例化,获取目标类的实例化对象及对应的接口;调用实例化对象的接口获取动画文件中的动画数据。本发明实施例中在不加载第三方动画到主舞台的情况下,直接去调用第三方动画文件的接口,实现动画数据的获取。
其中,如图2所示,所述步骤S1具体可以包括:
S11、定义一个动画文件加载实例;
具体的,仍以SWF文件为例,可以首先定义一个ActionScript的Loader实例。而在ActionScript中提供了一个Loader类用来加载SWF文件,或者是图片JPG,GIF动画等文件。因此定义一个SWF文件加载实例具体实现如下:
Var swfLoader:Loader=new Loader();
S12、注册动画文件加载完成的回调函数;
本步骤中仍以SWF文件为例,在ActionScript中提供了一个Loader实例的接口,用来注册加载完成事件,当Loader加载完成一个SWF文件后,会回调这个注册的函数,以告诉它SWF文件已经加载完成。在Loader中提供了一个addEventListener接口用来注册事件。
接口具体原型如下:
addEventListener(type:String,
listener:Function,
useCapture:Boolean=false,
priority:int=0,
useWeakReference:Boolean=false)
其中,第一个参数type:String用来表示注册的事件类型,对应于本文则是Event.COMPLETE,表示注册SWF加载完成事件;第二个参数listener:Function用来表示注册的完成事件完成后的回调函数,用于触发回调函数执行;第三个参数priority:int用于标示事件的优先级,使用默认值0;第四个参数useWeakReference:Boolean指定回调函数是弱应用还是强引用,使用默认值false。
S13、创建请求动画文件的接口;
仍以SWF文件为例,创建请求动画文件的接口即,创建请求SWF的接口URLRequest,在ActionScript提供接口用来从网络或者本地请求一个SWF 文件,具体接口如下:
URLRequest(url:String=null)
其中,参数url:String标示传入的URL地址或者本地路径。
S14、调用所述接口加载所述动画文件;
在动画文件为SWF文件时,可以调用Loader实例的接口来加载请求的SWF文件,具体接口如下:
load(request:URLRequest,context:LoaderContext=null)
其中,参数request:URLRequest就是加载的请求对象,就是步骤S13中创建的URLRequest对象。
S15、编写所述回调函数。
编写回调函数swfLoadCompleteHandler,此函数即是上面调用的注册加载完成的回调函数。
进一步的,如图3所示,上述步骤S2具体可以包括:
S21、查找所述动画文件使用的符号,所述符号包括所有使用的包名,所有的类名,所有的函数名和变量名;
S22、通过反编译工具读取所述使用的符号,确定所述动画文件具有的类及接口。
由于SWF文件的格式是公开的,很容易找到第三方的反编译工具,可以对SWF进行反编译,SWF文件会存储所有使用的符号,比如会存储所有的包名,所有的类名,所有的函数名和变量名等,那么通过反编译工具是可以读取到这些名字,可以知道这个SWF文件保护哪些类,哪些函数接口,从而可以为后续使用反射机制来获取到这些类及接口。
进一步的,如图4所示,上述步骤S3具体可以包括:
S31、调用类判断接口判断是否存在需要的目标类,若是,则执行步骤S32;
S32、调用类获取接口获取所述目标类;
S33、根据所述目标类,创建所述目标类的实例化对象,确定所述实例化对象的接口。
仍以SWF文件为例,首先在S1中我们通过Loader的接口加载了一个第三方的SWF文件,然后通过步骤S2的反编译可以看到SWF有哪些类有哪些接口,进而可以找到需要的接口来进行调用。先举例假设SWF有一个类名是ClassData,在Loader实例中已经将第三方的SWF文件加载了,那么通过Loader的接口则可以获取到第三方的类信息,并进行实例化。那么通过反射机制的具体调用方法是如下:
(1)先调用Loader的接口判断是否存在这个目标类。
通过Loader的接口hasDefinition(上述类判断接口)则可以判断第三方SWF是否具有这个目标类。原型如下:
hasDefinition(name:String):Boolean
其中,参数name:String则是填入类的名字(目标类的名字),返回值则是True则存在,是False则不存在。调用如下:
var bDefine:Boolean=swfLoader.contentLoaderInfo.applicationDomain.hasDefinition("ClassData");
其中,swfLoader则是步骤S1中加SWF的Loader实例,参数"ClassData"则是假设存在这个类。返回值bDefine标示是否存在这个类。
(2)调用Loader的接口获取这个目标类。
通过Loader的接口getDefinition(上述类获取接口)则可以获取到这个类。原型如下:
getDefinition(name:String):Object
其中,参数name:String则是类的名字,返回值则是目标类。
var cClass:Class=swfLoader.contentLoaderInfo.applicationDomain.getDefinition("ClassData")as Class;
其中swfLoader则是步骤S1中加SWF的Loader实例,参数"ClassData"则是假设存在这个目标类。返回值cClass则是对应的ClassData这个目标类。
(3)实例化类的对象。
通过步骤2获取到了类cClass后,可以通过其创建一个实例化对象,确定该实例化对象的接口。
具体如下:
Var obj:cClass=new cClass;
这样就创建了一个cClass的实例对象obj。至此,通过这个步骤就实现通过反射机制来创建一个类的实例化对象。
进一步的,如图5所示,上述步骤S4具体可以包括:
S41、获取所述目标类的目标接口;
其中,所述目标接口为用户需要获取动画数据的接口,所述目标接口具有用于存放加密前动画数据的数据参数;
S42、调用所述实例化对象的目标接口获取所述数据参数。
通过步骤S3创建了一个类的实例化对象obj,从而可以直接调用其接口方法,来实现如数据解密,数据获取等。具体如下:
假设类cClass有一个接口DecodeData(int*data,int nLen),接口有一个参数data,用于存放加密前的数据。则可以直接通过obj对象来调用。
Var nData:int;
Var nLen:int;
obj.DecodeData(nData,nLen);
至此,通过这个步骤就实现了通过反射机制获取到的类并调用其接口。从而可以比较方便的调用第三方SWF的接口的获取数据。
下面介绍本发明实施例中调用动画数据的装置的实施例。
请参阅图6,为本发明实施例中调用动画数据的装置的一个实施例示意图,该实施例中,调用动画数据的装置包括:
编写单元601,用于编写加载第三方的动画文件;
查找单元602,用于查找所述动画文件具有的类及接口;
获取单元603,用于获取需要的目标类并进行实例化,获取所述目标类的实例化对象及对应的接口;
调用单元604,用于调用所述实例化对象的接口获取所述动画文件中的动画数据。
进一步的,所述编写单元601具体用于:
定义一个动画文件加载实例;
注册动画文件加载完成的回调函数;
创建请求动画文件的接口;
调用所述接口加载所述动画文件;
编写所述回调函数。
进一步的,所述查找单元602具体用于:
查找所述动画文件使用的符号,所述符号包括所有使用的包名,所有的类名,所有的函数名和变量名;
通过反编译工具读取所述使用的符号,确定所述动画文件具有的类及接口。
进一步的,所述获取单元603具体用于:
调用类判断接口判断是否存在需要的目标类;
若是,则调用类获取接口获取所述目标类;
根据所述目标类,创建所述目标类的实例化对象,确定所述实例化对象的接口。
进一步的,所述调用单元604具体用于:
获取所述目标类的目标接口,所述目标接口为用户需要获取动画数据的接口,所述目标接口具有用于存放加密前动画数据的数据参数;
调用所述实例化对象的目标接口获取所述数据参数。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。