【问题标题】:webgame with simultaneous players多人同时进行的网页游戏
【发布时间】:2011-01-06 23:16:23
【问题描述】:

我见过很多玩家同时玩的基于网络浏览器的游戏。 通常在等待一段时间后,您可以加入一个每个人都在玩的房间,或者您可以与其他玩家对战。 所有这些游戏都使用 Flash。

他们是如何做到这一点的? 没有 Flash 的共犯会很复杂吗?

是否有提供此功能的工具包(rails 等)或插件? 还是只是存储会话并混合它们?

快速编辑: 我对 Flash 或 Silverlight 解决方案不感兴趣

【问题讨论】:

  • 很抱歉没有评论我正在做的游戏类型。这不是一款大型游戏,好吧,我不认为它会大受欢迎。而且我只需要 2 到 4 名玩家同时玩同一个游戏。

标签: javascript


【解决方案1】:

取决于您要使用的技术。 Flash 可以用来创建这样的游戏,Silverlight 也可以。它们都使用 javascript 将鼠标移动和其他用户输入异步发送到服务器,以便可以在服务器上更新游戏状态。

flash游戏开发篇: http://www.brighthub.com/internet/web-development/articles/11010.aspx

银光: http://www.brighthub.com/internet/web-development/articles/14494.aspx

【讨论】:

    【解决方案2】:

    如果您熟悉 ajax 并且您的游戏不需要用户之间的快速交互,则可以不使用 flash。但无论哪种情况,我相信您都必须轮询服务器。您可能还想阅读有关彗星的信息http://en.wikipedia.org/wiki/Comet_(programming))。

    【讨论】:

      【解决方案3】:

      Java Applet 能够与 JavaScript 通信(例如,您希望您的 UI 是 HTML 和 CSS)。因此,理论上,您可以在签名的 Java Applet 中实现您的网络代码。在这种情况下,您将不限于普通的客户端-服务器模型。

      【讨论】:

      • 我认为关键是他不想依赖 RIA 技术。
      【解决方案4】:

      你能说明一下你想制作什么样的游戏吗?回合制还是实时?

      由于您对 flash 或 silverlight 解决方案不感兴趣(它们可以使用套接字,因此可以很好地适应成千上万的用户),您可以使用 javascript 并使用 ajax 来发送和接收数据。

      基本上,您可以像套接字一样使用 ajax,方法是发送输入,然后让脚本“长时间轮询”服务器,方法是让服务器延迟响应它,直到它有数据要发送。唯一的问题是,您只能在超时(约 30 秒)之前将连接保持打开很长时间。这通常不是问题,因为您经常来回传递数据。

      我会研究 fastCGI(或者我相信它可以像这样工作)并让游戏服务器守护进程直接响应请求。这样,它可以打开单个数据库连接并快速处理所有客户端。虽然这不是必需的,但如果实施得当,它可能会很好地扩展。

      目前我一直在做一个有点幼稚的概念证明。 (比使用数据库作为状态并仅使用 PHP 脚本来更新和接收数据库的状态要天真。我应该注意,尽管对于少数用户和您自己的数据库来说,这工作得很好。我有 20 个客户在 100 左右走动毫秒更新。当然它不能很好地扩展并以每个客户端每秒 10 个连接杀死数据库,但它“有效”)。基本上我的想法是我让 javascript 生成数据包并将它们发送到 PHP 脚本。该 PHP 脚本打开一个 unix 域套接字并将数据转发到 C++ 守护程序。不过尚未对其进行基准测试,因此很难判断它的扩展性如何。

      如果您觉得舒服,但我确实建议您学习闪存和套接字网络。在 Linux 上使用 Epoll 或在 Windows 上使用 IOCP,您可以托管数百个客户端。过去我在 C# 套接字服务器上对 100 个客户端进行了测试,处理持续的小数据包流所用的 CPU 不到 5%。

      【讨论】:

        【解决方案5】:

        对于纯 JavaScript 解决方案有几个选项。它们都涉及一种或另一种形式的 AJAX。 (查看我在AJAX and Client-Server Architecture with JavaScript 上的回答,了解更多详细信息。)

        您可以在 AJAX 轮询、长轮询、COMET 或即将推出的 Web Sockets 之间进行选择。第一步是了解 AJAX。一旦你对它感到满意,你可以设置一个轮询系统(使用setInterval)每隔n毫秒轮询服务器以获取新数据。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多