一种游戏战争迷雾实现方法[发明专利]

(19)中华人民共和国国家知识产权局
(12)发明专利申请
(10)申请公布号 (43)申请公布日 (21)申请号 201710414086.6
(22)申请日 2017.06.05
(71)申请人 北京印刷学院
地址 102699 北京市大兴区兴华大街(二
段)1号
(72)发明人 杨鹏 陆利坤 李业丽 
(51)Int.Cl.
G06T  5/00(2006.01)
(54)发明名称
一种游戏战争迷雾实现方法
(57)摘要
本发明公开了一种游戏战争迷雾实现方法,
按照每个障碍物的大小给其添加盒子碰撞器,以
视野单位(玩家)为中心、视野半径为半径物理检
测四周障碍物,将检测到的障碍物点坐标和视野
边界处取样点坐标都保存到一个数组中,将数组
中点和玩家所在点依次组成三角形区域,这些多
个三角形区域总和在一起就组成了玩家视野区
域,将每个视野单位计算得到的视野范围写入视
野网格中并渲染到2D纹理贴图中,得到的迷雾效
果。本发明可以适用于大多数游戏地图,
同时也
不会消耗更多的游戏性能。权利要求书1页  说明书4页  附图3页CN 107358579 A 2017.11.17
C N  107358579
A
1.一种游戏战争迷雾实现方法,其特征在于,包括如下步骤:
S1在地图上到所有可能阻挡视野的对象,依次给每个对象加上一个盒子碰撞检测器,盒子碰撞器大小和物体本身的大小一致;
S2将拥有视野的玩家放入到地图当中,首先以玩家为中心,以玩家的视野半径为半径进行圆形物理碰撞检测;
S3记下碰撞检测到盒子碰撞器的坐标,确定每个盒子碰撞器四个顶点位置,创建一个坐标数组,将每个盒子碰撞器四个顶点坐标存入到这个坐标数组中;
S4再以玩家为中心,以玩家的视野半径为半径生成一个圆,在这个圆上按照一定间隔取边界点,将这些取到的边界点存入所述坐标数组中;
S5将玩家探测得到坐标数组中的每个点和该玩家所在坐标点之间连线与玩家x坐标轴正方向之间夹角计算出来,将这些点按照夹角大小顺序进行排序,存入到排序坐标点集合中;
S6每次取排序坐标点集合中相邻两个点和玩家所在坐标点,这三个点形成一个三角形,将每次形成的三角形的顶点存入到三角形顶点数组当中;
S7创建一个网格模型,网格模型顶点参数由排序坐标点集合组成,网格模型中三角形顶点集合由三角形顶点数组提供,这样形成了一个新的网格模型,网格模型范围就是迷雾范围;
S8将得到的新的网格模型渲染到一张2D纹理贴图中得到渲染贴图,除网格以外部分alpha值都为1,运用shader着器编程,将这张渲染贴图的alpha通道和游戏画面alpha通道混合,就可以实现迷雾效果。
2.根据权利要求1所述的游戏战争迷雾实现方法,其特征在于,由于不同时刻玩家位置会发生改变,从而视野范围会发生改变,因此迷雾范围需要定时更新:将迷雾范围更新的频率设置为T时间内更新一次,每隔T时间将最近的若干次迷雾范围计算的结果缓存起来,分别写入渲染贴图的alpha通道和游戏画面alpha通道混合,在shader着器中按时间进行插值过渡,得到新的迷雾范围。
3.根据权利要求2所述的游戏战争迷雾实现方法,其特征在于,T的取值为0.5s。
4.根据权利要求1所述的游戏战争迷雾实现方法,其特征在于,如果地图中存在多个玩家,那就需要同时计算多个视野范围:用玩家当前坐标(x ,y)和视野半径确定出一个唯一值K,K代表唯一地代表一个玩家U,用L表示U的生命周期;当U发生移动或者出现新的玩家,在每一帧中都会产生新的U,定义其生命周期为L,L的最大值和迷雾渲染更新频率T相同,对于每一帧中不移动的U ,就对U的生命周期L按照游戏一帧消耗时间进行递减,移除L小于或等于0的U,当L为最大值时,计算该玩家U的视野范围,对于0<L<MAX的玩家U全部不用计算其视野范围,所以U不移动时候不需要再计算视野范围。
5.根据权利要求4所述的游戏战争迷雾实现方法,其特征在于,K按照计算所得:
K=x*R+y/R,其中R为玩家的视野半径。
6.根据权利要求1所述的游戏战争迷雾实现方法,其特征在于,步骤S8中,当存在多个玩家时,最后将对每个玩家计算得到视野网格进行渲染到一张2D纹理贴图中,除网格以外部分alpha值都为1,运用shader着器编程,将这张渲染贴图的alpha通道和游戏画面alpha通道混合,就可以实现多玩家下的迷雾效果。
权 利 要 求 书1/1页CN 107358579 A
一种游戏战争迷雾实现方法
技术领域
[0001]本发明涉及游戏技术领域,具体涉及一种游戏战争迷雾实现方法。
背景技术
[0002]战争迷雾(Fog of War),在传统意义上是指战争中由于对敌人情报不清楚而无法确认除友军所在以
外的大部分地区,敌人的分布及活动情况。而目前在游戏范围内,尤其是即时战略类游戏中,这个词语出现的频率更高一些也更被多数人所熟悉。它可以在友方单位不在的情况下,让该区域视野丢失,这可以大大加强游戏的趣味性和可玩性,例如可以偷袭,埋伏敌方单位。
[0003]现在战争迷雾实现主要依靠两种方法来实现,一种是将地图以格子为单位绘制,将地图网格存储为二维数组,运用LOS视线检测算法计算出可见格子和不可见格子。通过已经保存的地图二位数组数据,把这些信息写入一张2D纹理,然后把这个纹理投影到整个地图中,对于多余的锯齿,在shader中针对视野内和视野外使用不同的着方式,达到模糊效果。这种方式存在一定局限性,地图必须是基于格子形成的拼接地图,这样不能用于大多数游戏地图当中。
[0004]另一种则采用射线检测方式来探测出视线范围内障碍物,把相邻的射线命中点和原点连成三角形,最后组成一个网格模型,该网格形成的区域就是可视范围。通过shader对该区域进行渲染就能达到迷雾效果。这种做法虽然视觉效果好,但是它的效率非常慢,因为它需要大量射线检测,尤其是对于射线探测遇到被探测物边界时候,需要在这一块区域,运用密集的射线进行迭代探测,以便到足够精确的交点,再加上对探测交点进行实时组装网格,这些都是低效率的操作。所以它的实用性虽然强,但是效率不高。当人物在移动时候,视野范围都发生了变化,这需要重新计算可视区域,如何大量单位发生移动,效率会明显降低,如何对迷雾检测和绘制优化也存在不足。
发明内容
[0005]针对现有技术的不足,本发明旨在提供一种游戏战争迷雾实现方法,可以适用于大多数游戏地图,同时也不会消耗更多的游戏性能。
[0006]为了实现上述目的,本发明采用如下技术方案:
[0007]一种游戏战争迷雾实现方法,包括如下步骤:
[0008]S1在地图上到所有可能阻挡视野的对象,依次给每个对象加上一个盒子碰撞检测器,盒子碰撞器大小和物体本身的大小一致;
[0009]S2将拥有视野的玩家放入到地图当中,首先以玩家为中心,以玩家的视野半径为半径进行圆形物理碰撞检测;
[0010]S3记下碰撞检测到盒子碰撞器的坐标,确定每个盒子碰撞器四个顶点位置,创建一个坐标数组,将每个盒子碰撞器四个顶点坐标存入到这个坐标数组中;
[0011]S4再以玩家为中心,以玩家的视野半径为半径生成一个圆,在这个圆上按照一定
间隔取边界点,将这些取到的边界点存入所述坐标数组中;
[0012]S5将玩家探测得到坐标数组中的每个点和该玩家所在坐标点之间连线与玩家x坐标轴正方向之间夹角计算出来,将这些点按照夹角大小顺序进行排序,存入到排序坐标点集合中;
[0013]S6每次取排序坐标点集合中相邻两个点和玩家所在坐标点,这三个点形成一个三角形,将每次形成的三角形的顶点存入到三角形顶点数组当中;
[0014]S7创建一个网格模型,网格模型顶点参数由排序坐标点集合组成,网格模型中三角形顶点集合由三角形顶点数组提供,这样形成了一个新的网格模型,网格模型范围就是迷雾范围;
[0015]S8将得到的新的网格模型渲染到一张2D纹理贴图中得到渲染贴图,除网格以外部分alpha值都为1,运用shader着器编程,将这张渲染贴图的alpha通道和游戏画面alpha 通道混合,就可以实现迷雾效果。
[0016]进一步地,由于不同时刻玩家位置会发生改变,从而视野范围会发生改变,因此迷雾范围需要定时更新:将迷雾范围更新的频率设置为T时间内更新一次,每隔T时间将最近的若干次迷雾范围计算的结果缓存起来,分别写入渲染贴图的alpha通道和游戏画面alpha 通道混合,在shader着器中按时间进行插值过渡,得到新的迷雾范围。
[0017]更进一步地,T的取值为0.5s。
[0018]进一步地,如果地图中存在多个玩家,那就需要同时计算多个视野范围:用玩家当前坐标(x,y)和视野半径确定出一个唯一值K,K代表唯一地代表一个玩家U,用L表示U的生命周期;当U发生移动或者出现新的玩家,在每一帧中都会产生新的U,定义其生命周期为L,L的最大值和迷雾渲染更新频率T相同,对于每一帧中不移动的U,就对U的生命周期L按照游戏一帧消耗时间进行递减,移除L小于或等于0的U,当L为最大值时,计算该玩家U的视野范围,对于0<L<MAX的玩家U全部不用计算其视野范围,所以U不移动时候不需要再计算视野范围。
[0019]更进一步地,K按照计算所得:
[0020]K=x*R+y/R,其中R为玩家的视野半径。
[0021]进一步地,步骤S8中,当存在多个玩家时,最后将对每个玩家计算得到视野网格进行渲染到一张2D纹理贴图中,除网格以外部分alpha值都为1,运用shader着器编程,将这张渲染贴图的alpha通道和游戏画面alpha通道混合,就可以实现多玩家下的迷雾效果。[0022]本发明的有益效果在于:本发明可以适用于大多数游戏地图,基同时也不会消耗更多的游戏性能。
[0023]本发明没有采用LOS算法来寻地图中的可见区域(这种算法过分依赖地图是基于格子,也并没有完全依赖于游戏引擎中的射线检测来查可见区域),而是在引擎中给障碍物加上一个盒子碰撞器,通过少量射线检测确定玩家视野半径内障碍物,只需要通过障碍物所在坐标和所加盒子碰撞器大小就能确定
障碍物边界四个顶点坐标,而不需要通过大量密集的射线检测来确定障碍物边界坐标,在玩家视野范围内没有障碍物边界处,采用抽样取点。在多玩家的情况下,为了避免多次重复计算某玩家视野范围,对每个玩家定义了一个生命周期,只要在生命周期内,玩家没有移动,就不需要再次计算它的视野范围,从多个方面进行优化来减少游戏性能消耗。
附图说明
[0024]图1为本发明的实施流程示意图;
[0025]图2为本发明实施例中盒子碰撞检测器的示意图;
[0026]图3为本发明实施例中玩家放入地图后进行圆形物理碰撞检测的示意图;[0027]图4为本发明实施例中在地图上取迷雾边界的示意图;
[0028]图5为本发明实施例中创建的网格模型示意图;
[0029]图6为本发明实施例中多视野单位时的流程示意图。
具体实施方式
[0030]以下将结合附图对本发明作进一步的描述,需要说明的是,本实施例以本技术方案为前提,给出了详细的实施方式和具体的操作过程,但本发明的保护范围并不限于本实施例。
[0031]本发明的总体技术思路为按照每个障碍物的大小给其添加盒子碰撞器,以视野单位(玩家)为中心、视野半径为半径物理检测四周障碍物,将检测到的障碍物点坐标和视野边界处取样点坐标都保存到一个数组中,将数组中点和玩家所在点依次组成三角形区域,这些多个三角形区域总和在一起就组成了玩家视野区域,将每个视野单位计算得到的视野范围写入视野网格中并渲染到2D纹理贴图中,得到的迷雾效果。
[0032]如图1所示,所述游戏战争迷雾实现方法具体如下:
[0033]在地图上面到所有可能阻挡视野范围的对象,依次给每个对象加上一个盒子碰撞检测器,盒子碰撞器大小和物体本身的大小一致。这样可以通过盒子位置就能确定它的四个边界点位置,如图2所示,1表示盒子碰撞器,2表示障碍物,3,4,5,6表示障碍物四个边界点。
[0034]将拥有视野的玩家放入到地图当中,首先以玩家为中心,以玩家视野半径(视野半径事先设定)为半径进行圆形物理碰撞检测(射线检测),如图3所示,图中A为视野单位(玩家),B为障碍物,C为视野单位的视野圈。通过记下碰撞检测到盒子碰撞器的坐标,确定每个盒子碰撞器四个顶点位置,创建一个坐标数组,将每个盒子四个顶点坐标存入到这个坐标数组中。
[0035]在本实施例中,视野范围指的是玩家实际能看到范围,譬如在一个圆范围内有障碍物,有一部分会被遮挡,这样就只有部分视野范围。
[0036]再以玩家为中心,以玩家的视野半径为半径做一个圆,在这个圆上按照一定间隔取点,点取的越密集,形成迷雾边界越真实,按照一定合理间隔即可,将这些取到的边界点存入当坐标数组当中,具体形式如图4所示,图中X表示视野单位,L为所采边界点最小间隔。[0037]将玩家探测得到坐标数组中的每个点和该玩家所在坐标点之间连线和玩家x坐标轴正方向之间夹角计算出来,将这些点按照夹角大小顺序进行排序,存入到排序坐标点集合中。
[0038]每次取排序坐标点集合中相邻两个点和玩家所在坐标点,这三个点形成一个三角形,将每次形成三角形顶点存入到三角形顶点数组当中,具体效果见图5,创建一个网格模型,网格模型顶点参数由排序坐标点集合组成,网格模型中三角形顶点集合由三角形顶点

本文发布于:2024-09-20 21:14:37,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/418315.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:视野   玩家   游戏   范围   迷雾   坐标   进行   网格
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议