基于编程语言对骨骼动画进行碰撞检测的方法、电子设备与流程

文档序号:17071138发布日期:2019-03-08 23:19阅读:186来源:国知局
基于编程语言对骨骼动画进行碰撞检测的方法、电子设备与流程

本发明涉及编程语言领域,尤其涉及基于编程语言对骨骼动画进行碰撞检测的方法、电子设备。



背景技术:

骨骼动画(skeletonanimation)又称骨架动画,是一种计算机动画技术,它将三维模型分为两部分:用于绘制模型的蒙皮,以及用于控制动作的骨架。跟传统逐格动画相异,骨骼动画利用建立好的骨架套用到一张或多张图片,使之动作,比起一般一张一张绘出动作省了很多时间与精力。

然而,骨骼动画在电子设备运行时,容易发生碰撞,即骨骼动画a与骨骼动画b碰撞,那么骨骼动画a将骨骼动画b重叠,导致显示异常。

现有技术中,通过在骨骼动画中加入物理引擎,从而检测骨骼动画是否发生碰撞。例如,通过cocos-js引擎来检测骨骼动画是否发生碰撞。这一方式虽然有效,但是,引入物理引擎(如cocos-js引擎)将降低游戏性能,即容易造成游戏卡顿。

也就是说,现有技术中,在不引入物理引擎的情况下,无法检测骨骼动画是否发生碰撞。

因此,现有技术还有待于改进和发展。



技术实现要素:

鉴于上述现有技术的不足,本发明的目的在于提供基于编程语言对骨骼动画进行碰撞检测的方法、电子设备,旨在解决无法直接检测骨骼动画是否发生碰撞的问题。

本发明的技术方案如下:

一种基于编程语言对骨骼动画进行碰撞检测的方法,其包括:

a、读取骨骼类中的骨骼文件,并判断是否成功读取骨骼文件;

b、当成功读取骨骼文件时,通过预先定义碰撞盒子的盒子模型对骨骼文件的原始渲染树节点进行更新,得到坐标数组;

c、遍历得到的坐标数组,取出坐标数组中的横坐标最大值时对应的第一坐标、横坐标最小值时对应的第二坐标、纵坐标最大值时对应的第三坐标以及纵坐标最小值时对应的第四坐标;

d、根据得到的第一坐标、第二坐标、第三坐标和第四坐标建立相应的目标矩形;

e、判断所述目标矩形与所述碰撞盒子是否相交,如果相交,则判定发生碰撞。

优选的,所述步骤a之前包括:

s、预先定义骨骼类,并定义骨骼类的目标目录。

优选的,所述步骤a具体包括:

a1、在所述目标目录中读取所述骨骼文件;

a2、将读取得到的骨骼文件传入一回调函数中;

a3、判断是否成功读取骨骼文件,当读取骨骼文件成功时,则转入步骤b,当读取骨骼文件失败时,则抛出相应的错误报告。

优选的,所述步骤b具体包括:

b1、读取所述碰撞盒子的名称;

b2、通过预先定义的盒子模型对骨骼文件的原始渲染树节点进行更新,得到坐标数组;

b3、判断所述坐标数组的长度是否有效,如果有效,则转入步骤c,若无效,则结束流程。

优选的,所述判断所述坐标数组的长度是否有效的步骤具体包括:

计算所述坐标数组的长度,得到计算结算结果,当计算结果大于0,并且为偶数时,则判定坐标数组的长度有效;当计算结果等于0或计算结果为基数时,则判定坐标数组的长度无效。

优选的,所述步骤d具体包括:

以第一坐标、第二坐标、第三坐标和第四坐标分别作为目标矩形的四个顶点坐标,建立相应的目标矩形。

优选的,所述步骤d之后、e之前包括:

去除目标矩形长度和目标矩形宽度的浮点数。

本发明还提供一种电子设备,其包括:

处理器,适于实现各指令,以及

存储设备,适于存储多条指令,所述指令适于由处理器加载并执行:

读取骨骼类中的骨骼文件,并判断是否成功读取骨骼文件;

当成功读取骨骼文件时,通过预先定义碰撞盒子的盒子模型对骨骼文件的原始渲染树节点进行更新,得到坐标数组;

遍历得到的坐标数组,取出坐标数组中的横坐标最大值时对应的第一坐标、横坐标最小值时对应的第二坐标、纵坐标最大值时对应的第三坐标以及纵坐标最小值时对应的第四坐标;

根据得到的第一坐标、第二坐标、第三坐标和第四坐标建立相应的目标矩形;

判断所述目标矩形与所述碰撞盒子是否相交,如果相交,则判定发生碰撞。

本发明还提供一种计算机程序产品,其中,计算机程序产品包括存储在非易失性计算机可读存储介质上的计算机程序,计算机程序包括程序指令,当程序指令被处理器执行时,使所述处理器执行所述的基于编程语言对骨骼动画进行碰撞检测的方法。

本发明还提供一种非易失性计算机可读存储介质,其中,所述非易失性计算机可读存储介质存储有计算机可执行指令,该计算机可执行指令被一个或多个处理器执行时,可使得所述一个或多个处理器执行所述的基于编程语言对骨骼动画进行碰撞检测的方法。

有益效果:通过本发明提供的方法,将计算得到的目标矩形与预设的碰撞盒子进行对比,判断两者是否相交,如果目标矩形与碰撞盒子相交,那么相应的骨骼动画便发生碰撞。这样,便可以在保持游戏性能的同时检测骨骼动画是否发生碰撞,不需要引入物理引擎,从而大大提高了效率,降低了成本以及节约了资源。

附图说明

图1为本发明基于编程语言对骨骼动画进行碰撞检测的方法较佳实施例的流程图。

图2为本发明电子设备较佳实施例的结构框图。

具体实施方式

本发明提供基于编程语言对骨骼动画进行碰撞检测的方法、电子设备,为使本发明的目的、技术方案及效果更加清楚、明确,以下对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

请参阅图1,一种基于编程语言对骨骼动画进行碰撞检测的方法,其包括:

s1、读取骨骼类中的骨骼文件,并判断是否成功读取骨骼文件;

s2、当成功读取骨骼文件时,通过预先定义碰撞盒子的盒子模型对骨骼文件的原始渲染树节点进行更新,得到坐标数组;

s3、遍历得到的坐标数组,取出坐标数组中的横坐标最大值时对应的第一坐标、横坐标最小值时对应的第二坐标、纵坐标最大值时对应的第三坐标以及纵坐标最小值时对应的第四坐标;

s4、根据得到的第一坐标、第二坐标、第三坐标和第四坐标建立相应的目标矩形;

s5、判断所述目标矩形与所述碰撞盒子是否相交,如果相交,则判定发生碰撞。

通过本发明提供的方法,用户在不引入物理引擎的情况下,便能实现检测骨骼动画是否发生碰撞的目的。从而大大提高了游戏的性能,并且降低了资源使用,提高了效率。

优选的,所述步骤s1之前包括:

s0、预先定义骨骼类,并定义骨骼类的目标目录。

所述骨骼类的具体名称为skeleton,skeleton具有对骨骼数据的引用并且存储了骨骼实例的状态,具体是由骨骼的动作,骨骼的颜色等组成。

定义骨骼类的目标目录是指在骨骼类中建立一个特殊的文件夹,并将建立的文件夹作为目标目录。

优选的,在创建骨骼类后,并继承骨骼类。

这样,便可以方便从目标目录中读取数据。

所述步骤s1中,读取骨骼类中的骨骼文件,具体的,可通过脚本文件读取骨骼文件。也就是说,通过执行脚本文件,从而获取(读取)骨骼类中的骨骼文件。

其中,骨骼文件具体是指spine文件。spine是一款2d动画软件,也就是说,通过spine编辑得到所述骨骼文件,即得到spine文件。

优选的,所述步骤s1具体包括:

s11、在所述目标目录中读取所述骨骼文件;

s12、将读取得到的骨骼文件传入一回调函数中;

s13、判断是否成功读取骨骼文件,当读取骨骼文件成功时,则转入步骤s2,当读取骨骼文件失败时,则抛出相应的错误报告。

所述步骤s11中,通过执行脚本文件在所述目标目录中读取骨骼文件。

所述步骤s12中,所述回调函数是一个通过函数指针调用的函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

也就是说,先调用回调函数,然后将读取得到骨骼文件传入至回调函数中。

所述步骤s13中,当将骨骼文件传入至回调函数时,可能存在部分骨骼文件尚未成功读取的问题。也就是说,将骨骼文件传入至回调函数与在骨骼类中读取骨骼文件是同时进行,因此,需要判断是否成功读取骨骼文件。如果,成功读取所有的骨骼文件,那么转入步骤s2,如果未完全读取骨骼文件,那么将显示相应的提醒(错误报告),例如,显示的错误报告为:当前骨骼文件未完全读取,无法执行下一步。

所述步骤s2中,所述碰撞盒子具体是指一种坐标系信息。

所述盒子模型是指skeletonbounds。

具体的,在成功读取所述骨骼文件后,通过skeletonbounds更新sekelton的原始渲染树节点(sgnode)。

优选的,所述步骤s2具体包括:

s21、读取所述碰撞盒子的名称;

s22、通过预先定义的盒子模型对骨骼文件的原始渲染树节点进行更新,得到坐标数组;

s23、判断所述坐标数组的长度是否有效,如果有效,则转入步骤s3,若无效,则结束流程。

所述步骤s21中,读取碰撞盒子名称是指获取碰撞盒子的id。

所述步骤s22中,通过skeletonbounds更新sekelton的原始渲染树节点(sgnode),从而得到坐标数组。

所述步骤s23中,对坐标数组的长度进行判断,当坐标数组的长度有效时,则转入步骤s3,如果坐标数组的长度无效,那么,舍弃步骤s22得到的坐标数组。

优选的,所述判断所述坐标数组的长度是否有效的步骤具体包括:

计算所述坐标数组的长度,得到计算结算结果,当计算结果大于0,并且为偶数时,则判定坐标数组的长度有效;当计算结果等于0或计算结果为基数时,则判定坐标数组的长度无效。

具体的,先读取坐标数组的长度,即获取坐标数据的位数。例如,坐标数组a具体为:ab,cd,那么坐标数组的长度为2位,例如,坐标数组a具体为:0,cd,那么坐标数组的长度为1位,再例如,坐标数组a具体为:0,0,那么坐标数组的长度为0位。其中,坐标数组中的0表示“空”,即对应的坐标数据不存在数据。也就是说,如果坐标数组的横坐标或纵坐标存在字符,则将长度记录为1;如果坐标数组的横坐标和纵坐标均存在字符,则将长度记录为2,如果坐标数组的横坐标和纵坐标均不存在字符,则将长度记录为0。

只有当坐标数组的长度大于0,且坐标数组的长度为偶数时,坐标数组才有效;如果坐标数组的长度等于0,或者坐标数组的长度为奇数,那么坐标数组无效,将舍弃对应的坐标数组。

所述步骤s3中,遍历(traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。当然遍历的概念也适合于多元素集合的情况,如数组。

当遍历数组时,取出坐标数组中的第一坐标,第二坐标,第三坐标和第四坐标。

例如,坐标数组具体包括:(a,b)、(c,d)、(e,f)、(g,h)、(i,j)、(k,l)和(m,n);其中,a<m<e<g<k<i<c;n<b<d<f<h<j<l。也就是说,当前坐标数组中,横坐标的最大值为c,横坐标的最小值为a,纵坐标的最小值为n,纵坐标的最大值为l,那么将(c,d)作为第一坐标,将(a,b)作为第二坐标,将(k,l)作为第三坐标,将(m,n)作为第四坐标。

优选的,所述步骤s4具体包括:

以第一坐标、第二坐标、第三坐标和第四坐标分别作为目标矩形的四个顶点坐标,建立相应的目标矩形。

在获取第一坐标、第二坐标、第三坐标和第四坐标后,则分别以第一坐标、第二坐标、第三坐标和第四坐标为目标矩形的四个顶点,从而得到目标矩形。

优选的,所述步骤s4之后、s5之前包括:

去除目标矩形长度和目标矩形宽度的浮点数。

在建立目标矩形后,获取目标矩形的长度和宽度。需要说明的,目标矩形并非数学上中的矩形,目标矩形的四条边长的长度可以不相等,也就是说,目标矩形实际为数学中的四边形。

本步骤具体的说,是获取目标矩形四条边的长度,如果存在小数,则自动删除小数。

例如,目标矩形四条边的边长分别为:a.6、b.5、c.7和d.487,那么自动删除浮点数后的长度分别为:a、b、c和d。

所述步骤s5中,根据得到的目标矩形和预设的碰撞盒子,判断两者是否相交。

具体的,如果,碰撞盒子的一个或多个顶点的坐标落在目标矩形坐标的范围内,则两者相交。

请参阅图2,本发明还提供一种电子设备10,其包括:

处理器110,适于实现各指令,以及

存储设备120,适于存储多条指令,所述指令适于由处理器加载并执行:

读取骨骼类中的骨骼文件,并判断是否成功读取骨骼文件;

当成功读取骨骼文件时,通过预先定义碰撞盒子的盒子模型对骨骼文件的原始渲染树节点进行更新,得到坐标数组;

遍历得到的坐标数组,取出坐标数组中的横坐标最大值时对应的第一坐标、横坐标最小值时对应的第二坐标、纵坐标最大值时对应的第三坐标以及纵坐标最小值时对应的第四坐标;

根据得到的第一坐标、第二坐标、第三坐标和第四坐标建立相应的目标矩形;

判断所述目标矩形与所述碰撞盒子是否相交,如果相交,则判定发生碰撞。

所述处理器110可以为通用处理器、数字信号处理器(dsp)、专用集成电路(asic)、现场可编程门阵列(fpga)、单片机、arm(acornriscmachine)或其它可编程逻辑器件、分立门或晶体管逻辑、分立的硬件组件或者这些部件的任何组合。还有,处理器还可以是任何传统处理器、微处理器或状态机。处理器也可以被实现为计算设备的组合,例如,dsp和微处理器的组合、多个微处理器、一个或多个微处理器结合dsp核、任何其它这种配置。

存储设备120作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,如本发明实施例中的基于编程语言对骨骼动画进行碰撞检测的方法对应的程序指令。处理器通过运行存储在存储设备中的非易失性软件程序、指令以及单元,从而执行基于编程语言对骨骼动画进行碰撞检测的各种功能应用以及数据处理,即实现上述方法实施例中的基于编程语言对骨骼动画进行碰撞检测的方法。

关于上述电子设备10的具体技术细节,已在上述步骤中详述,故此不做赘述。

本发明还提供一种计算机程序产品,其中,计算机程序产品包括存储在非易失性计算机可读存储介质上的计算机程序,计算机程序包括程序指令,当程序指令被处理器执行时,使所述处理器执行所述的基于编程语言对骨骼动画进行碰撞检测的方法。

本发明还提供一种非易失性计算机可读存储介质,其中,所述非易失性计算机可读存储介质存储有计算机可执行指令,该计算机可执行指令被一个或多个处理器执行时,可使得所述一个或多个处理器执行所述的基于编程语言对骨骼动画进行碰撞检测的方法。

应当理解的是,本发明的应用不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1