在 Node.js 如火如荼发展的今天,我们已经可以用它来做各种各样的事情。前段时间UP主参加了极客松活动,在这次活动中我们意在做出一款让“低头族”能够更多交流的游戏,核心功能便是 Lan Party 概念的实时多人互动。极客松比赛只有短得可怜的36个小时,要求一切都敏捷迅速。在这样的前提下初期的准备显得有些“水到渠成”。跨平台应用的 solution 我们选择了 node-webkit,它足够简单且符合我们的要求。 按照需求,我们的开发可以按照模块分开进行。本文具体讲述了开发 Spaceroom(我们的实时多人游戏框架)的过程,包括一系列的探索与尝试,以及对 Node.js、WebKit 平台本身的一些限制的解决,和解决方案的提出。

Getting started

Spaceroom 一瞥 {#spaceroom-} 在最开始,Spaceroom 的设计肯定是需求驱动的。我们希望这个框架可以提供以下的基础功能:

  • 能够以 房间(或者说频道) 为单位,区分一组用户
  • 能够接收收集组内用户发来的指令
  • 在各个客户端之间对时,能够按照规定的 interval 精确广播游戏数据
  • 能够尽量消除由网络延迟带来的影响 当然,在 coding 的后期,我们为 Spaceroom 提供了更多的功能,包括暂停游戏、在各个客户端之间生成一致的随机数等(当然根据需求这些都可以在游戏逻辑框架里自己实现,并非一定需要用到 Spaceroom 这个更多在通信层面上工作的框架)。

APIs {#apis} Spaceroom 分为前后端两个部分。服务器端所需要做的工作包括维护房间列表,提供创建房间、加入房间的功能。我们的客户端 APIs 看起来像这样:

  • spaceroom.connect(address, callback) – 连接服务器
  • spaceroom.createRoom(callback) – 创建一个房间
  • spaceroom.joinRoom(roomId) – 加入一个房间
  • spaceroom.on(event, callback) – 监听事件
  • ……  

客户端连接到服务器后,会收到各种各样的事件。例如一个在一间房间中的用户,可能收到新玩家加入的事件,或者游戏开始的事件。我们给客户端赋予了“生命周期”,他在任何时候都会处于以下状态的一种:

ss_0 你可以通过 spaceroom.state 获取客户端的当前状态。 使用服务器端的框架相对来说简单很多,如果使用默认的配置文件,那么直接运行服务器端框架就可以了。我们有一个基本的需求:服务器代码 可以直接运行在客户端中,而不需要一个单独的服务器。玩过 PS 或者 PSP 的玩家应该清楚我在说什么。当然,可以跑在专门的服务器里,自然也是极好的。 逻辑代码的实现这里简略了。初代的 Spaceroom 完成了一个 Socket 服务器的功能,它维护房间列表,包括房间的状态,以及每一个房间对应的游戏时通信(指令收集,bucket 广播等)。具体实现可以参看源码。 查看更多