确定2D游戏斜45度地图大型物体遮挡关系的方法与流程

文档序号:15390044发布日期:2018-09-08 01:01阅读:1776来源:国知局

本发明涉及2d游戏的图形处理领域,尤其是指一种确定2d游戏斜45度地图大型物体遮挡关系的方法。



背景技术:

在2d游戏中,斜45度地图是一种较为常见的视角,其既可以像3d游戏一样表现出立体效果,又可以像其他2d游戏一样,给设计师很高的自由度进行美术创作。区别于3d游戏处理遮挡关系所使用的深度测试方法(depthtesting),2d游戏处理遮挡关系是通过画家算法(paintersalgorithm)实现的。而画家算法需要给每个物体提供一个虚拟的深度值,依靠对这个深度值进行排序,画家算法可以由远及近顺序逐个画出物体,从而表现出遮挡关系。这个虚拟的深度值通常会与物体的二维坐标相关,这个关系依据画面表现的角度不同,而有所变化。现有的方案,对于斜45度地图来讲,设一个物体坐标为(x,y),则这一关系可以表示为:

虚拟深度值=y*地图宽度+x

这是一个通过观察总结出来的经验公式。通过公式计算出来的深度值越小,物品排在越后面,越先被绘制。对于rpg游戏,地图上移动的物体如人物、怪物等,体积通常都不会很大,可以适用这一公式,视觉上可以正确表现遮挡关系。此外,这一公式也可适用于正方形底座的大型物体,而底面边长不一致的物体,是无法使用上述公式的,如图1、图2所示,图1和图2中各有三个物体,从左到右依次是a、b和c,其中a和c的坐标在图1和图2中是不变的,唯一变化的是b的摆放方向。容易看出,图1和图2的物体遮挡关系是不一样的,图1中从近到远,为左a、中b、右c;图2中从近到远,为右c、中b、左a。而通过上述公式计算出各物体的虚拟深度值是不变的,无法同时满足图1和图2的情况,显然上述公式是不适用的。因此需要对现有遮挡处理技术进行革新。



技术实现要素:

本发明所要解决的技术问题是:针对现有技术的缺陷与不足,提出一种确定2d游戏斜45度地图大型物体遮挡关系的方法。

为了解决上述技术问题,本发明采用的技术方案为:一种确定2d游戏斜45度地图大型物体遮挡关系的方法,包括以下步骤:

s1、将地图网格化,赋予网格坐标,根据网格坐标建立二维数组;

s2、为地图上的每个物体分配唯一的编号,其中每个物体占用至少一个网格;

s3、在有物体占用的网格中填入对应物体的编号,没有物体占用的网格填入0;

s4、根据网格坐标系和网格中的物体的编号赋予对应物体虚拟深度值;

s5、根据各个物体的虚拟深度值在地图上渲染绘制对应的物体。

进一步的,在步骤s3中,还包括对二维数组进行遍历的步骤,包括:

s31、建立一维数组columnchecked[v];

s32、沿坐标系第一列横向检查,判断网格中是否存在物体,否则进入步骤s33,是则进入步骤s34;

s33、令columnchecked[v]+1,继续检查直到该列检查完毕,进入步骤s39;

s34、判断该物体的编号数据是否存在栈checkingobjects中,否则进入步骤s35,是则进入步骤s39;

s35、将该物体的编号数据存入栈checkingobjects中,进入步骤s36;

s36、判断该编号数据是否位于checkingobjects的栈顶,是则进入步骤s37,否则进入步骤s39;

s37、判断当前网格的横向坐标是否等于对应物体所占网格中的最大横向坐标,是则进入步骤s38,否则进入步骤s39;

s38、将该物体的编号数据从checkingobjects出栈,并将该物体的虚拟深度值赋值为d,且令d=d+1,完成后进入s39;

s39、切换到下一列继续检查,直到最后一列,判断所有物体是否都获取虚拟深度值,是则完成遍历,否则返回步骤s32。

进一步的,步骤s38之中,还包括令columnchecked[v]+1的步骤。

进一步的,步骤s38之后,还包括记录已经赋予虚拟深度值赋值的物体。

进一步的,步骤s39之中,还包括比对已经赋予虚拟深度值赋值的物体的数目和物体总数的步骤。

本发明还涉及一种确定2d游戏斜45度地图大型物体遮挡关系的装置,包括网格生成单元、物体管理单元、物体深度赋予单元和物体绘制单元,

所述网格生成单元用于在地图上生成网格,并为每个网格分配唯一坐标;

所述物体管理单元用于为每个物体分配唯一的编号;

所述物体深度赋予单元用于为各个物体赋予虚拟深度值;

所述物体绘制单元用于根据各个物体的虚拟深度值在地图上绘制对应的物体。

进一步的,所述物体深度赋予单元包括检测模块、标记模块、栈模块、比对模块、赋值模块、判断模块和储存模块,

所述检测模块用于检测网格中是否有物体;

所述标记模块用于将所述检测模块检测到的物体的编号存入栈模块;

所述比对模块用于检测当前物体的编号是否处于栈顶;

所述赋值模块用于将物体的编号取出栈模块并为该物体赋予虚拟深度值;

所述判断模块用于判断当前情况并根据当前情况选择对应执行步骤;

所述储存模块用于储存各物体的虚拟深度值。

进一步的,所述物体深度赋予单元还包括校验模块,所述校验模块用于检测所有物品是否都被赋予虚拟深度值。

本发明还涉及一种处理地图中物体遮挡关系的装置,包括上位机,所述上位机包括处理器,所述处理器用于执行存储器中存储的计算机程序时实现上述方法的步骤。

本发明还涉及一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述方法的步骤。

本发明的有益效果在于:提供一种算法,通过将地图网格化,再将分散在各个网格中的物体进行遍历对齐,得到所有物体各自的虚拟深度值,再通过各物体的虚拟深度值确定先后绘制物体的次序,使物体在地图上可呈现正确的遮挡关系,实现了更好的显示效果。

附图说明

下面结合附图详述本发明的具体结构

图1为本发明的遮挡关系示意图之一;

图2为本发明的遮挡关系示意图之二;

图3为本发明的处理方法流程示意图;

图4为本发明的处理方法遍历流程示意图;

图5为本发明的实施示例的遮挡关系示意图。

具体实施方式

为详细说明本发明的技术内容、构造特征、所实现目的及效果,以下结合实施方式并配合附图详予说明。

请参阅图3,一种确定2d游戏斜45度地图大型物体遮挡关系的方法,包括以下步骤:

s1、将地图网格化,赋予网格坐标,根据网格坐标建立二维数组;

s2、为地图上的每个物体分配唯一的编号,其中每个物体占用至少一个网格,如果一个物体占据了某个或某几个网格,就在对应的数组元素中填入物体编号;

s3、在有物体占用的网格中填入对应物体的编号,没有物体占用的网格填入0;

s4、根据网格坐标系和网格中的物体的编号赋予对应物体虚拟深度值;

s5、根据各个物体的虚拟深度值在地图上渲染绘制对应的物体。

本实施例中,首先假设地图是由边长相等的网格所构成,设地图横向长度为u个网格,纵向长度为v个网格,则可建立二维数组t[v][u],即共有u*v个元素,每个元素均与此地图上的网格一一对应,每个网格有自己独立的坐标,每个网格可容纳一个元素。而位于地图上的物体,都会以网格坐标进行对齐,各个物体都具有一定的底面积(最小为1个网格),利用这个网格坐标系统,就可以确定物体之间的相对位置,从而确定物体的遮挡关系。

从上述描述可知,本发明的有益效果在于:提供一种算法,通过将地图网格化,再将分散在各个网格中的物体进行遍历对齐,得到所有物体各自的虚拟深度值,再通过各物体的虚拟深度值确定先后绘制物体的次序,使物体在地图上可呈现正确的遮挡关系,实现了更好的显示效果。

实施例1

请参阅图4,在步骤s3中,还包括对二维数组进行遍历的步骤,包括:

s31、建立一维数组columnchecked[v],用于记录每一横行已经检查过元素个数;

s32、沿坐标系第一列横向检查,判断网格中是否存在物体,否则进入步骤s33,是则进入步骤s34;

s33、令columnchecked[v]+1,继续检查直到该列检查完毕,进入步骤s39;

s34、判断该物体的编号数据是否存在栈checkingobjects中,否则进入步骤s35,是则进入步骤s39;

s35、将该物体的编号数据存入栈checkingobjects中,进入步骤s36;

s36、判断该编号数据是否位于checkingobjects的栈顶,是则进入步骤s37,否则进入步骤s39;

s37、判断当前网格的横向坐标是否等于对应物体所占网格中的最大横向坐标,是则进入步骤s38,否则进入步骤s39;

s38、将该物体的编号数据从checkingobjects出栈,并将该物体的虚拟深度值赋值为d,且令d=d+1,完成后进入s39;

s39、切换到下一列继续检查,直到最后一列,判断所有物体是否都获取虚拟深度值,是则完成遍历,否则返回步骤s32。

在上述的基础上,本实施例中,还包含先将虚拟深度值累加器置0的初始化步骤。

实施例2

在实施例1的基础上,步骤s38之中,还包括令columnchecked[v]+1的步骤。

本实施例中,为物体赋予虚拟深度值后,令columnchecked[v]+1,表示已标记当前物体。

实施例3

在实施例2的基础上,步骤s38之后,还包括记录已经赋予虚拟深度值赋值的物体。

本实施例中,记录已经赋予虚拟深度值赋值的物体是为了方便之后与物体总数作对比,增加效率。

实施例4

在实施例3的基础上,步骤s39之中,还包括比对已经赋予虚拟深度值赋值的物体的数目和物体总数的步骤。

本实施例中,将当前已赋予虚拟深度值的物体的数目与物体总数做对比,可确定是否还需要继续遍历数组,增加效率。

本发明还涉及一种确定2d游戏斜45度地图大型物体遮挡关系的装置,包括网格生成单元、物体管理单元、物体深度赋予单元和物体绘制单元,

所述网格生成单元用于在地图上生成网格,并为每个网格分配唯一坐标;

所述物体管理单元用于为每个物体分配唯一的编号;

所述物体深度赋予单元用于为各个物体赋予虚拟深度值;

所述物体绘制单元用于根据各个物体的虚拟深度值在地图上绘制对应的物体。

实施例5

所述物体深度赋予单元包括检测模块、标记模块、栈模块、比对模块、赋值模块、判断模块和储存模块,

所述检测模块用于检测网格中是否有物体;

所述标记模块用于将所述检测模块检测到的物体的编号存入栈模块;

所述比对模块用于检测当前物体的编号是否处于栈顶;

所述赋值模块用于将物体的编号取出栈模块并为该物体赋予虚拟深度值;

所述判断模块用于判断当前情况并根据当前情况选择对应执行步骤;

所述储存模块用于储存各物体的虚拟深度值。

实施例6

所述物体深度赋予单元还包括校验模块,所述校验模块用于检测所有物品是否都被赋予虚拟深度值。

本发明还涉及一种处理地图中物体遮挡关系的装置,包括上位机,所述上位机包括处理器,所述处理器用于执行存储器中存储的计算机程序时实现上述方法的步骤。

上位机可以为平板电脑、台式电脑等具有信号处理能力的终端设备,上位机包括:电源、存储器、显示单元、处理器以及存储在存储器中并可在处理器上运行的计算机程序。所述处理器执行计算机程序时实现上述各个方法实施例中的步骤。或者,所述处理器执行所述计算机程序时实现上述各装置实施例中各模块或单元的功能。

示例性的,所述计算机程序可以被分割成一个或多个模块/单元,所述一个或者多个模块/单元被存储在所述存储器中,并由所述处理器执行,以完成本发明。所述一个或多个模块/单元可以是能够完成特定功能的一系列计算机程序指令段,该指令段用于描述所述计算机程序在所述上位机中的执行过程。

本发明还涉及一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述方法的步骤。

实施示例

请参阅图5,从左到右从上到下遍历二维数组。初始时d=0。左侧为物体a,中间为物体b,右边为物体c。

第1行从坐标(0,0)开始向右遍历检查,因为(0,0)到(0,4)坐标上都没有物体,则遍历完第一行后columnchecked[0]的值为5,表示第1行已经全部检查完了。于是进入第2行。

第2行从(1,0)开始向右遍历检查,到(1,2)为止都没有物体,此时columnchecked[1]的值为3。因为(1,3)上有物体b,且当前横坐标(u轴)为1,小于物体b的最大横坐标3,则将b压入栈checkingobjects中,并进入第3行。

第3行从(2,0)开始向右遍历检查,到(2,2)为止都没有物体,此时columnchecked[2]的值为3,因为b已经在栈中,直接进入第4行。

第4行从(3,0)开始向由遍历检查,到(3,1)为止都没有物体,此时columnchecked[3]的值为2,因为(3,2)上有物体a,将物体a压入栈checkingobjects中。

因为物体a现在为栈顶元素,且当前横坐标为3,等于物体a的最大横坐标3,所以将物体a出栈,记a的虚拟深度值为d也就是0,并令d=d+1(则现在d=1),并将columnchecked[3]的值修改为3,进入第5行。

第5行从(4,0)开始向右遍历检查,因为(4,0)到(4,4)坐标上都没有物体,则遍历完第一行后columnchecked[4]的值为5,表示第5行已经全部检查完了。

这样第一轮遍历已经完成,已经标记了虚拟深度值的对象只有a,需要进行下一轮遍历。

第1行因为columnchecked[0]为5,表示已经第1行已经处理完了,直接进入第2行,

第2行因为columnchecked[1]为3,从(1,3)开始向右遍历检查,因为(1,3)上有物体b,且b已经在栈中,直接进入第3行,

第3行因为columnchecked[2]为3,从(2,3)开始向右遍历检查,因为(2,3)上有物体b,且b已经在栈中,直接进入第4行,

第4行因为columnchecked[3]为3,从(3,3)开始向右遍历检查,因为(3,3)上有物体b,且b现在为栈顶元素,且当前横坐标为3,等于物体b的最大横坐标3,所以将物体b出栈,记b的虚拟深度值为d也就是1,并令d=d+1(则现在d=2),并将columnchecked[1]、columnchecked[2]、columnchecked[3]的值修改为4,进入第5行。

第5行因为columnchecked[4]为5,表示已经第5行已经处理完了。

这样第二轮遍历已经完成,已经标记了虚拟深度值的对象有a、b,需要进行下一轮遍历。

第1行因为columnchecked[0]为5,表示已经第1行已经处理完了,直接进入第2行,

第2行因为columnchecked[1]为4,从(1,4)开始向右遍历检查,因为(1,4)上有物体c,将物体c压入栈checkingobjects中。

因为物体c现在为栈顶元素,且当前横坐标为1,等于物体a的最大横坐标1,所以将物体c出栈,记c的虚拟深度值为d也就是2,并令d=d+1(则现在d=3),并将columnchecked[1]的值修改为5。

至此,物体abc的虚拟深度值都已经确定了,其中a的虚拟深度值为0,b的虚拟深度值为1,c的虚拟深度值为2。因为是从左到右从上到下遍历二维数组,所以渲染顺序为a、b、c。

以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

当前第1页1 2 
网友询问留言 已有1条留言
  • 访客 来自[中国] 2023年03月10日 17:13
    非常有新意
    0
1