Javascript多人游戏 – 服务器端validation。

我开始使用HTML 5 / Javascript创build一个多人游戏。

我目前正在做一些关于如何阻止人们作弊的不同想法的原型。 现在我知道我需要做一切服务器端,只是让客户端发送“行动”。

我的问题是我不能锻炼最好的方式来存储每个玩家的游戏状态。

所以只要看一些基本的东西 两名玩家绕着一张空地图跑。

目前我的想法是

两个客户端(sockets.io)都将他们的动作发送到一个Node.JS服务器,然后用X / Y坐标来响应。 这可以。 但显然,两个客户都需要知道其他玩家在哪里。

我想通过为每个游戏创build一个新的数据库表,并将游戏状态存储在那里,这样两个node.js连接可以相互交stream。

我的问题是,这是两个node.js连接之间进行交互的最佳方式,是否足够快? 还是有一个这个特定的任务,我错过了devise模式?

谢谢

每场比赛创造一个新桌子通常被认为是一个可怕的想法。

如果你不需要持久性 – 即。 在你的Node.js服务器咋呼的情况下,一个游戏可能会丢失 – 你可以简单地将游戏存储在一个对象中,比如games ,这个games可能包含一个拥有一组players的对象,每个对象都可能包含xy坐标等

 var games = { 123019240: { players: { 123: {x: 1, y: 1, name: 'Joe'}, 456: {x: 2, y: 2, name: 'Jimbob'} } } }; 

但是,如果确实需要持久化,那么实际上可能应该考虑一些其他数据库而不是SQL – 例如, Redis 可能是该任务的不错select。

无论如何,SQL感觉就像是一个错误的工具,并且更加需要创build新的表格。 (如果你使用的是SQL,可以考虑使用game_idplayer_idxy的表格布局,并确保在game_id上有一个索引:))

您需要采取的方法如下:

每个客户端以特定的时间间隔(使用emit )将其坐标发送到服务器。 服务器检查此位置的有效性并将其存储在数据库中。 然后,它使用广播消息( http://socket.io/#how-to-use-广播消息)将此位置发送给所有客户端。 每个客户都会更新所移动angular色/玩家的显示位置。

您不能在两个玩家之间build立直接连接,因为他们使用的是浏览器。 每个连接都必须通过一个node.js服务器。

你可以在这里查看一些教程: http : //www.nodejs-news.com/nodejs-tech/Nodejs-Socketio-Building-HTML5-game/

(他们使用Impact引擎,但原理相同)

根据我的经验,如果您有用户在群集服务器环境中彼此交互,最好让他们在同一台服务器上进行交互。

例:

5个游戏服务器,人们在大厅里一起创造游戏。 游戏包含最多的人数。 在这种情况下,将游戏保存在一台服务器上并使所有用户连接到一台游戏服务器上要容易得多。 这可以防止服务器之间需要的convo,并保持游戏状态一致和快速!

Eve Online就是一个很好的例子。 每个“区域”是它自己的服务器,当你在宇宙中旅行的时候,你会被透明地移动到另一个游戏服务器。 那样的话,如果你和别人打架,那么他们有可能在同一台服务器上。 然后游戏服务器可以自由定期向数据库写入数据。 这是最好的方式,因为用户不必等待数据库。 他们直接与游戏服务器通信,游戏服务器每隔一段时间就与数据库通信。 最多的时候,你的用户只会丢失几秒钟的数据(对于那个游戏服务器上的其他人也是如此)。