Articles of 多人游戏

基于在线多人游戏浏览器的游戏服务器技术?

我想要构build一个简单的跨浏览器的多人游戏(如国际象棋或纸牌游戏),它将使用套接字与服务器通信。 我有一些Ruby语言的中间知识,但是我不太确信它是多客户端服务器的一个很好的解决scheme,所以认为Node.js或者Socket.io可能是一个更好的解决scheme。 我知道Java或者C ++对于这个工作来说可能很棒,但是我对它们都不太满意,所以这就是我对服务器端JavaScript的兴趣所在。 我的问题是,你认为什么是这样一个项目的最佳解决scheme? 什么可能是最好的服务器端技术,我将build立一个完整的游戏和通信逻辑? 也许他们的一些组合? 任何有关速度,服务器负载,托pipe解决scheme和每种技术的开发速度的意见将不胜感激。

TypeError:io.connect不是一个函数

我正在使用节点js和socket.io( http://rawkes.com/articles/creating-a-real-time-multiplayer-game-with-websockets-and-node.html )来学习一个简单的多人游戏教程。 。 我有一个问题,当我试图连接到套接字server.I得到一个错误,说TypeError:io.connect不是一个函数PS:我是一个总的初学者在节点js和socket.io所以请帮助我。 var util = require("util"); io = require("socket.io"), Player = require("./Player").Player; var socket, players; function init(){ players = []; socket = io.listen(8000); socket.configure(function() { socket.set("transports", ["websocket"]); socket.set("log level", 2); }); setEventHandlers(); socket = io.connect("http://localhost", {port: 8000, transports: ["websocket"]}); };

不一致的Date.now()值

我构build了一个HTML5多人游戏,取决于在服务器和客户端之间进行合理准确的时间同步。 在大多数情况下,我使用的algorithm是非常准确的 – 它只是估计客户端服务器时间增量是什么,即服务器当前时间与客户端当前时间之间的差异。 例如,如果服务器时间比客户端时间提前5秒,则时间增量为5000毫秒。 客户端和服务器(node.js)都是用Javascript编写的。 该algorithm的工作原理如下: 在客户端logging时间: var clientTime = Date.now(); Ping服务器。 当服务器接收到消息时,它立即发送一个响应,其中只包含一件事情:接收到消息时服务器上的时间。 var serverTime = Date.now(); // Send serverTime to the client 当客户端收到服务器响应时, 立即logging时间: var clientTime2 = Date.now(); 现在,我们知道当服务器收到消息时,客户端时间必须在clientTime和clientTime2之间。 如果服务器在客户端时间为clientTime时接收到消息(即客户端 – >服务器请求花费了0ms),则时间增量为var delta1 = (serverTime – clientTime); 如果服务器在客户端时间为clientTime (即服务器 – >客户端响应以某种方式花了0ms)接收到消息,则时间增量为var delta2 = (serverTime – clientTime2) 。 因此,我们可以放心地说,时间增量介于delta1和delta2之间。 现在,重复这个过程很多次,每次根据你得到的结果来缩小范围,你就可以很好地估计时间增量。 我已经在7个不同的浏览器和多台机器上testing过数百次,并且从来没有遇到任何问题。 这从来没有不一致。 但问题是,我的服务器日志显示, 偶尔会有几个人得到非常不一致的时间同步结果。 […]

Node.js多人游戏使用express和socket.io

这些天我正试图与2名玩家实现一个简单的多人游戏。 游戏逻辑在服务器端,也就是玩家的创造和移动。 我也想要实现在canvas周围弹跳的球。 我怎样才能实现呢? 在服务器端还是客户端? 我认为在服务器上创build它们会更好,但是我已经尝试过了,创build好了,但是之后当我将球的位置发送给客户端时,每个球都有相同的位置,当服务器尝试移动球时,不要移动,例如改变位置。 最糟糕的是我无法渲染它们。 任何人都已经遇到过这样的问题,并解决了这个问题? 我怎样才能解决这个球的弹跳问题?

导轨转向基础的游戏经理

我正在写一个回合制的纸牌游戏(线上线上扑克)。 我有使用rails的经验,所以我想使用它的大部分的逻辑,如用硬币和统计pipe理用户,pipe理房间和游戏。 我打算使用节点js + socket.io + redis来提供实时消息服务器 – >客户端(基本上使用rails的redis发布消息,在node.js端监听它们并通过socket.io发布到客户端)和使用REST API从客户端 – >服务器进行通信。 我坚持的部分是试图pipe理轨道内的实际游戏逻辑。 我将需要一个正在进行的游戏的游戏pipe理器来评估游戏中发生的所有事情(交易卡,接受投注,通过玩家轮stream,评估结果等)。 特别是有两件事情对我来说似乎不太可能,那就是从我迄今为止使用rails构buildwebapp的经验来看这种情况: 将游戏pipe理器作为内存中的单个共享对象:我认为这可能是一个rediscaching对象,将在每次状态更改时重新加载,并以新状态再次保存,这似乎是一个很大的开销。 另一件我正在考虑的事情是拿着一个游戏pipe理器对象的散列,每个正在进行的游戏作为一个静态对象,可以从rails应用程序的任何地方访问。 任何我在这里失踪? 这可以以某种方式改善或任何其他方法来做这种function? 有一个计时器,在等待玩家进行动作时发出嘀嗒如同任何基于回合的游戏,我需要等待特定的秒数,直到玩家反应,如果玩家不采取行动让我们说20秒,那么服务器应该自动移动到下一个玩家。 我真的不知道如何在轨道上做到这一点。 我考虑的一种方法是延迟的任务,在20秒之后运行,并且如果用户在其之前行动,到期的玩家转向或被取消。 (使用sidekiq作为这些任务的例子)。 编辑 我被困在devise如何实现实际的游戏逻辑,这就是为什么我需要一个游戏经理,每个活跃的游戏(每个游戏至less有2个玩家)需要有一个计时器滴答滴答,那里需要一个如果玩家没有轮到下一个玩家,则在x秒后callback。 由于每个请求的无状态性质,我不明白我该如何做到这一点,我需要在内存中存储游戏状态并以某种方式运行计时器。 我相信我可以在node.js中的游戏逻辑中解决这个特定的问题,但我宁愿使用node.js来pipe理套接字连接,并通过redis pub / sub接收事件。

为什么WebSocket.onmessage事件不会触发?

经过几个小时的忙碌之后,我根本找不到解决办法。 我正在使用“node.js”为我正在开发的基于canvas的在线游戏的WebSocket服务器上工作。 我的游戏可以很好地连接到服务器,它接受握手,甚至可以发送消息到服务器。 但是,当服务器响应客户端时,客户端不会收到消息。 没有错误,没有什么,只是平静地坐在那里。 我已经撕开了我的代码,试图解决这个问题的一切,但唉,没有。 这是我的服务器代码的一个剥离的副本。 正如我之前所说,握手工作正常,服务器接收数据正常,但发送数据回到客户端没有。 var sys = require('sys'), net = require('net'); var server = net.createServer(function (stream) { stream.setEncoding('utf8'); var shaken = 0; stream.addListener('connect', function () { sys.puts("New connection from: "+stream.remoteAddress); }); stream.addListener('data', function (data) { if (!shaken) { sys.puts("Handshaking…"); //Send handshake: stream.write( "HTTP/1.1 101 Web Socket Protocol Handshake\r\n"+ "Upgrade: WebSocket\r\n"+ "Connection: […]

RTS HTML5游戏多人游戏 – 启动node.js服务器游戏

我用HTML5制作了一个RTS游戏( 带有create.js ), 并且想用node.js添加多人游戏部分。 我可以将html和javascript文件转换为.exe,以使用Web2ExeWin-v0.4.2b作为“正常”应用程序运行游戏 我研究了node.js并启动了一些简单的服务器。 概念:用户打开游戏,可以启动单人游戏(无需服务器)或用户启动多人游戏,可以邀请朋友到大厅。 之后,他可以开始多人游戏。 正常的rts游戏。 想法:要启动服务器游戏,我必须执行“node server.js”命令。 现在用户将join他的服务器,并可以将数据发送给其他游戏用户join游戏。 问题:这个想法出了什么问题? 我无法运行用户的cmd命令来打开节点服务器,因为它在javascript中。 什么是在JavaScript中实现node.js多人部分的正常方式,以便每个用户可以创build自己的游戏服务器?

Socket.io在服务器端丢失数据

黄色, 所以,我正在做一个多人在线游戏节点(为funzies),我困在一个问题已经一个多星期了。 也许解决方法很简单,但我忘了它。 长话短说: 数据从客户端发送到服务器,这个emit每16.66ms发生一次。 服务器正确接收它们,我们收集所有的数据(在这种情况下,大量的火球)。 我们把它们保存在player.skills_to_execute数组中。 每5秒钟,我们将数据复制到单独的数组( player_information ),因为我们是现在的一个,所以它可以不断收集新的数据,然后把所有收集到的数据发送回客户端。 问题肯定是在服务器端。 有时候这是有效的,有时却不行。 player_information是我发送回前面的数组,但是在发送之前,如果确实包含数据,我会在服务器上检查console.log, 并且这样做 ! 但不知何故,数据被删除/覆盖之前发送,它发送空数组(因为我检查前端,我收到空)。 代码是相当复杂的,但我已经在这里最小化,所以更容易理解它。 这段代码停留在客户端,并且应该像下面这样工作: // front.js socket.on("update-player-information", function(player_data_from_server){ console.log( player_data_from_server.skills_to_execute ); }); socket.emit("update-player-information", { skills_to_execute: "fireball" }); 这段代码停留在服务器端,并且应该如下运行: // server.js socket.on("update-player-information", function(data){ // only update if there are actually skills received // we dont want every request here to overwrite actual […]

在多人Socket.io游戏中pipe理套接字

我正在用Node.js和Socket.io构build一个大型的多人游戏。 所有的玩家都会在相同的无限地图上移动(想想Minecraft)。 随着玩家的移动,我加载了他们可见的瓷砖。 当玩家移动他们的动作时,应该发送给所有可以看到他们的玩家。 我的问题是 我应该如何去构build我的套接字? 对于所有玩家来说,只有一个sockets看起来不像是可以缩放的。 我可以把世界分成块,但我不知道如何pipe理块的边界。 由于大多数玩家大多数时间都无法看到彼此,所以我更希望每个玩家的套接字只能得到与他们相关的更新。 我读过,Socket.io有一个“房间”的概念,它只是sockets,得到相同的消息。 为每个连接的玩家设置一个单独的房间是否可行? 然后,每次玩家移动,我都可以发送消息给那个房间。 当观众离开或join房间时,我怎么能pipe理呢? 显然这是一个模糊的问题,但我只是寻找最佳实践的build议。 链接到这个问题的文章将不胜感激。

使用Nodejs和Socket IO的多玩家游戏

我正在尝试使用Node和Socket IO的多人赛车游戏,expression。 所以我试过简单的例子来看看节点服务器和客户端之间的延迟。 我在客户端有一个可拖动的图像。 当我移动图像引擎代码heren一个客户端,它必须在所有的客户端。 所以基本上当我移动的图像我发送的图像位置的节点服务器的JSON格式,然后从那里我广播给所有客户端。 有一个约300毫秒的时间延迟。 以下是结果。 客户端1发送数据到服务器:286136(时间戳)服务器收到:286271 客户端2收到的数据位于:286470客户端3收到的数据位于:286479客户端4收到的数据位于:286487客户端5收到的数据位于:286520 从客户端1到客户端5之间的延迟时间为384毫秒。 它太高的赛车游戏..这里是我的服务器代码。 var app = require('express').createServer(); var io = require('socket.io'); var http = require('http'); var http_server = http.createServer(); var server = http.createServer(app); server.listen(3000); var socket = io.listen(server,{ log: false }); socket.sockets.on('connection', function (client) { client.on('message', function (data){ console.log("data arrived to server",new Date().getTime()); // Below both […]