根据玩家位置从服务器发送数据

时间:2018-09-23 12:34:33

标签: node.js algorithm websocket viewport anti-cheat

我有2D多人浏览器游戏。游戏包含类蛇玩家和充满不同颜色方块的世界。

当前,我从服务器发送这些数据:

  • 如果有新玩家出现-有关他的所有方块和玩家的数据以及有关其他产生的玩家的数据
  • 如果有人改变了举动-有关所有人的足迹,位置和方向的数据
  • 如果某些块的颜色发生了变化-有关所有人的数据

因此,我不会发送冗余数据,而是将所有数据发送给所有人。修改客户端的骗子可以看到一切!因此,我需要根据客户的视口向他们发送数据。


对于类似蛇的玩家,我可能会检查玩家的最小和最大值,X和Y。

如果玩家A接近玩家B,则服务器将向客户端A发送有关玩家B的数据。 如果玩家A离玩家B太远,服务器将从客户端A移除玩家B。 仅当玩家A在附近时,服务器才会发送有关玩家B更改的数据。


主要问题

但是我不确定如何发送有关块的数据。恐怕我会发送过多的冗余数据。

当玩家生成时,我将向他发送有关他附近的方块的数据。同样,当他附近的方块颜色改变时,我也会将其发送给他。

如果玩家向左移动,我将向他发送有关左侧区域的数据。但是我应该多久做一次呢?每当他旅行一个街区距离时,我都应该给他发送新的街区吗?

如果玩家决定去他已经去过的地方怎么办?我是否应该再次向他发送冗余数据?或者我可以检查一下那里的方块是否已更改。但是我怎么还记得那个球员已经看到了一些障碍?我可能不记得玩家看到的所有方块(方块的数量太大)。这样会影响性能。

如何保护我的游戏免受变焦作弊者的侵扰,并且不降低性能?

1 个答案:

答案 0 :(得分:0)

因此,您尝试实现的功能有时称为网络气泡。每个玩家都可以获取他周围的数据(就像他周围的泡沫),但不是所有数据。因此,您可以定义发送给他的玩家周围的方块数量。例如,发送与他当前块直接相邻的所有块。

block1 - block2 - block3

block4 - player - block5

block6 - block7 - block8

关于如何记住块的问题,您将需要在客户端上使用某种存储阵列(例如,哈希图),在其中存储块。

然后,您的服务器需要提供一种可能性,以检查客户端阻止是否仍是最新的。这可以通过散列函数来完成。您的服务器将计算所请求块的哈希值,如果块中的数据发生更改,则哈希值也会更改。比较服务器的哈希值和存储的客户端块的哈希值,然后仅在它们不匹配时才发送块数据。