0

我正在使用 node.js 在单击 HTML 元素时生成一个子进程(恰好是一个视频游戏)。当然,客户端和服务器应该在同一台机器上。当我现在这样做时,游戏会打开,但所有键盘按键当然都会进入浏览器,而不是在生成时打开的全屏游戏。

如何将所有键盘按下从客户端路由到子进程(游戏)?

我唯一的想法是让客户端监听按键,然后将它们(通过 Socket.IO 之类的东西)传递给节点,然后节点将它们发送给孩子。恐怕这会导致按键和游戏之间的延迟。另外,我什至不确定如何首先将实际按键发送到子进程。

-- 这就是我如何产生这个过程 --

var spawn = require('child_process').spawn;
var prc = spawn('gameinquestion',  ['-v']);
4

1 回答 1

0

想法:

  • 在导航器的窗口上绑定一个keydown事件
  • 通过 ajax 将密钥转发给 Node(请记住,您需要对此进行权衡。您可以一个一个地发送密钥,这会导致并发问题或高延迟 - 稍后会详细介绍。或者您可以将按键打包成数据包发送,这意味着您将延迟某些按键操作)
  • 节点使用本机解决方案传达击键(我不确定你在哪个平台上)

但是,对于您正在做的事情(玩游戏),您可能希望将 Node 完全排除在外,并获得类似http://badassjs.com/post/711624134/novnc-a-vnc-viewer-in- javascript(纯 JS 中的 VNC 客户端)。

更多关于延迟的信息

如果您逐个传达击键,您将需要担心一些稍后会触发的请求实际上会更快到达(有时是一点点,有时是很多)。这可能会也可能不会改变单独请求到达节点服务器的顺序。如果您要逐个传达击键,您将始终想要做的是让 Node 发回“收到的最后一次击键”的唯一 ID,以便客户端知道它在哪个键上......或者让客户端记录它收到的击键次数,发送当前的所有击键,并让服务器重新构建订单。

第二种选择是数据包解决方案 - 不是发送一个按键,而是将它们捆绑在x keystrokesx milliseconds' worth of keystrokes中。如果您输入很多,第一个很好,因为更新会更快,但如果您输入很少,则更糟。第二个很好,因为你知道你最多会被延迟x。然而,IT 很糟糕,因为你知道你必须依靠侥幸才能延迟不到x.

此外,即使在第 2 种情况下,除非您选择一个愚蠢的大打包帧,否则您需要实施解决方案 1。

于 2013-05-25T21:49:19.313 回答