游戏的大地图中对象状态的同步

    游戏战场的地图很大,在地图上活跃着成百上千的玩家。服务器是如何同步地图上玩家英雄、怪物、建筑等地图对象的状态呢?肯定不能把地图上所有对象的状态同步给玩家,因为数据量实在太大,服务器只要将玩家视野周围的地图对象状态同步给玩家即可,这样既可以满足需求,下面介绍如何同步玩家视野周围的地图对象状态。

    可以把地图看成由很多个小方格组成的,而玩家英雄、怪物、建筑都在方格上,而服务器只需要将视野所在格子周围格子上的地图对象的状态变化同步给玩家即可,这正是玩家屏幕所看到的区域。如图:

    我们可以个给每一个格子从左到右,然后再从上到下进行编号,编号从零开始,这样我们可以用一个数组管理地图对象。根据坐标x,y计算index=y*width+x,用index作为下标,我们可以快速找到所处坐标格子上的地图对象,计算的时间复杂度O(1)。

    如何界定玩家视野周围的地图对象这是个问题,假设手机一屏幕可以显示10×10个方格,那么我们只需要要将以玩家视野为中心点,10×10个方格上地图对象的状态同步给玩家即可。这样客户端就可以获取地图对象状态的变化,然后呈现给玩家。随着玩家英雄移动不断移动玩家视野点,这样玩家就可以看地图上其他英雄、怪物以及建筑的状态、位移的变化。

    但是这样玩家视野每移动一个格子,就需要重新计算周围十格地图,然后将之前已经出视野的地图对象移除视野,将新进入视野的的地图对象增加进入视野,完进行同步。当怪物或者有英雄状态变化时,还要需要计算在视野内可以看到该对象的格子,将状态同步给在这些格子上有视野点的玩家,计算起来比较繁琐。

    还有一种处理方式,就是将地图再次以一屏幕为一个格子再次划分。一个大格子包含10×10个小方格。这样整个地图又被以屏幕为单位的大格子划分开。如图:

 

当玩家首次进入地图时,根据出生点坐在坐标计算出,玩家所处屏幕格子,假如所处屏幕格子时编号5。那么需要分别在1-9这九个格子设置视野点,同时将这九个屏幕格子上所有小格子上的地图对象推送给前端用于显示。

因为这9个格子都设置了视野点,这九个格子上如果有地图对象状态发生变化或者有玩家英雄进入这九个格子时,前端都会收到地图对象状态变化的消息推送。

当玩家视野点在大格子5内移动时,不需要修改视野点。这样无论玩家视野点处于屏幕格子的那个位置,都可以得到屏幕显示的所有对象的状态信息。当玩家视野点移到其他格子时,再重新计算确定新的九个格子,在新的格子上设置视野点,同时移除旧格子上的视野点。另外将旧的格子上的地图对象移除视野,新格子上的地图对象添加到视野。

而当地图对象状态变化时,计算所处大格子,找到大格子上所有视野点对应的玩家进行状态同步。

这样就实现了大地图上英雄、怪物、建筑等地图对象状态位置等信息的同步。

猜你喜欢

转载自blog.csdn.net/qq_19825249/article/details/108736686