更新客户端Javascript游戏视口

时间:2012-12-07 14:29:34

标签: javascript node.js web-applications

我正在编写一个javascript网页游戏,其中包含一个类似于Urban Dead使用的3 x 3视口。 “世界地图”存储为100 x 100 2D阵列服务器端(nodejs),每对坐标定义一个“房间”。因此,3 x 3视口显示了9个房间的名称和内容。

用户的位置在服务器端存储为坐标。例如。 Bob = { x : 2, y : 3 }。所以Bob的x坐标是Bob.x。客户端(浏览器)可以检索这个并计算出其他8个房间的坐标,并向服务器询问这些房间的内容。然后,它们将显示在视口中。这可能看起来像Urban Dead(左上角)中的视口。

问题

如何让视口“刷新”或更新?我想这样做......

1)当玩家从坐标(2,3)移动到(1,3)时。客户端再次询问服务器有关9个房间的内容,并重新绘制/显示所有内容。

2)当其中一个房间的内容发生变化时,服务器(nodejs)会运行一个客户端功能,告诉它向服务器询问9个房间的内容并重新启动绘制/显示所有内容。

对编程不熟悉,我想知道这个实现是不是太幼稚或低效?

3 个答案:

答案 0 :(得分:1)

我不担心过于天真或低效的解决方案。困难的部分是使游戏可玩和有趣 - 以后优化。

查看示例,要传输的数据量看起来不是很大。您应该可以获取完整的9个房间集进行更新。

您是否通过间隔(轮询)从服务器中提取数据,或者您是否以某种方式将更改从服务器推送到客户端?

答案 1 :(得分:1)

问题是您是否关心AFK被通知,以及有关下一个房间的信息有多重要。

如果您认为如果房间更新,策略可能会改变?在这种情况下,每次更新都会更新。

如果玩家不在乎,那么在传递到下一个房间时就会进行更改。

中间解决方案是根据游戏每10或30秒询问一次“delta”更新(只是已被修改过的元素)。在这种情况下,我们中央时钟可以很有趣(多个玩家将同时更新),这将创建一个转身风格的游戏。

作为RPG播放器(纸质RPG),我认为第三种是好方法。您甚至可以混合解决方案:当前房间的短时更新和基于感知的时间(金光闪闪和聋人只会在重大活动时更新外部空间)。

答案 2 :(得分:1)

前一个选项将是最好的imo,纯粹是因为当您的地图展开时,您将更容易设置触发区域,导致您的客户端加载地图的特定区域。您甚至可以只加载他们可以看到或有权访问的房间。

这也有好处,例如,如果你有多个角色。想象一下,你的主角在一个地方,而在其他地方有一个次要角色。客户端知道它们的位置并了解每个角色可以看到的内容并且仅从服务器请求此信息会好得多。这是一个更加可扩展的解决方案,而不是让服务器只是将所有房间信息不断地广播给正在收听的人。

关于房间内容的变化,这可以被标记为从服务器到所有客户的事件 - 但纯粹基于房间坐标和最小数据。如果此事件涵盖客户端当前可以看到的一个房间,则可以发出该客户端对房间信息的请求。所以在某种程度上,这涉及你的选择二,但不应该广播。

作为类比,这更类似于让客户/用户在他们想要的时候仅从网站请求他们想要的资源,并且可能签署关于他们感兴趣的内容的邮件警报。而不是让用户注册RSS源,并在网站上发生任何变化时收到通知。前者更为优化,可以通过特定方式进行控制,如果您的用户有兴趣浏览网站的整个内容(通常情况下在游戏中不是这种情况,后者会更好),除非您正在设计机器人必须作弊)

总的来说,通过实施这两种方法的一部分进行讨论之后会很有用。但如果它是一个选择,第一个将给你更多的控制。