Articles of 多人游戏

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 […]

多人游戏是否总是从每个客户请求的数据库中请求数据?

那么我不知道这个问题的标题是否合适,但我不知道如何把这个几句话。 我目前正在使用服务器端的NodeJS和Socket.io以及客户端的HTML5开发多人2D游戏。 这个游戏不需要保存玩家的进度,除非他们完成。 而且我必须确保关于球员的所有信息,比如得分和帮助总是有效的。 所以我决定把这个信息集中在服务器上,这样客户端就不会把分数发送给服务器,而是根据发送的信息计算服务器的分数并发送给所有客户端。 除此之外,我可以有不同的运行这个游戏的最低两名球员和最多4名球员运行。 起初,我决定实现这一点,服务器总是维护内存中的游戏会话数据,但现在我问自己,如果我不应该使用数据库来存储这些数据。 我正在使用数据库存储会话数据只有当他们完成,因为我没有使用未完成的会话数据。 但是,我应该在游戏中保持会话和玩家的数据吗? 我的问题在于,客户端与服务器的通信非常频繁,我必须先从数据库请求数据,进行必要的更改,将其存储回数据库,然后对每个客户端请求重复此过程。 也许这个答案很明显,但是我应该用这个方法吗? 这是我第一次开发游戏,所以我不知道事情是如何工作的。 我只知道我希望服务器速度很快。 我select维护内存中的所有内容,主要是因为所有关于多人游戏开发的例子和教程都没有提到数据库。 谢谢!

使用node.js / socket.io构build一个实时的大型多人游戏有多昂贵?

您好,我正在尝试使用node.js和socket.io构build一个实时多人游戏。 现在,在编码方面实现本身并不是什么大问题,但是来自传统的http请求响应web编程模型,我不知道在stream量和服务器负载方面会有多昂贵。 基本上在游戏期间,玩家的浏览器应当跟踪实时的鼠标input事件,并且将其广播给同一游戏中的所有其他玩家。 下面是一个例子,假设我的头像围绕我的鼠标指针在屏幕上显示,并且应该实时播放给屏幕上的其他玩家。 我会做这样的事情: // client side $(document).on("mousemove", function(event){ io.emit("coordinate", {x: event.pageX, y: event.pageY}); }); 并在服务器上: // server side io.sockets.on("connection", function(socket){ … socket.on("coordinate", function(coordinate){ socket.get("username", function(err, username){ socket.broadcast.emit("move", {username: username, coordinate:coordinate}); }); }); … }); 我认为这应该起作用,但是这需要浏览器每秒向服务器发送几个事件,随后应该向同一游戏中的其余玩家广播它们,并且我担心这个事情的含义。 有一件事是,每个传输的数据片段的大小不是那么大(基本上只是一个x和y坐标)。 如果这太贵,不pipe这个游戏多么伟大,我都不认为我能发货。 谁能开导我吗? 谢谢。 [编辑]澄清,我不问如何使这个架构更有效率。 我只想知道这种types的系统在系统负载(和维护成本)方面是否足够现实对于普通的Web服务,我可以通过查看页面视图数字来估计成本,但websocket是一个全新的领域,我不知道的,所以我想问。

关于更新我的node.js游戏的问题

我正在做一个小游戏,为服务器使用node.js,为客户端使用embedded在HTML5canvas中的.js文件。 玩家可以用箭头键移动。 现在我已经提出了两种更新游戏的方法,一种是每次改变玩家的新位置。 它的工作,但我的服务器必须处理大约每秒60对(客户端的更新速度是30 /秒,有2名球员不停地移动)。 第二种方法是在改变方向速度时只发送玩家对象的新位置和速度/方向,所以基本上在其他客户端上使用来自上次更新的方向/速度对玩家的移动进行插值。 我的服务器只需要处理很less的x / y7speed / direction数据包,但是当数据包到达时,我的客户端经历了一些延迟,因为插入的位置通常与数据包中写入的实际位置相距一点点。 现在我的问题是:你会推荐哪种方法? 而我应该如何为两种方法做出滞后赔偿?