在扭曲中实现联网的多人游戏循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在扭曲中实现联网的多人游戏循环相关的知识,希望对你有一定的参考价值。

我正在开发一个游戏项目,我决定采用扭曲的服务器部分。

它是一款多人射击游戏。

现在我想将一个主循环集成到游戏中(在服务器端)来处理输入和物理(用于子弹和玩家)。输入通过websockets从客户端收到。我希望游戏循环可以运行游戏。 50 fps。

如果我按照实施游戏循环的方法提到in this atricle。我在下面有这个代码

previous = getCurrentTime()

def loop():
    double lag = 0.0
    while True:

      current = getCurrentTime()
      elapsed = current - previous
      previous = current
      lag += elapsed

      processInput()

      while (lag >= MS_PER_UPDATE):
        update()
        lag -= MS_PER_UPDATE
      send_state_to_connected_clients()

在文章中它提到:

如果您正在制作一个在网络浏览器中运行的游戏,那么您几乎无法编写自己的经典游戏循环。浏览器基于事件的性质排除了它

现在我很难理解它,因为它适用于Twisted,因为它也是基于事件的。(我认为它所说的while true语句将永远阻止反应堆。那么我们可以做什么来实现我们自己的循环在扭曲中给予它甚至基于)

在同一篇文章中,它提到了以下几点:

使用平台的事件循环: 这很简单。您不必担心编写和优化游戏的核心循环 它与平台搭配很好。您不必担心明确地给主机时间来处理它自己的事件,缓存事件,或者管理平台输入模型与您之间的阻抗不匹配。

我正在寻找的是实现扭曲游戏循环的一般方法(用于网络多人游戏)。

  • 我应该使用内置反应堆使用LoopingCall来调用我的Loop?那么它如何处理文章中提到的问题。
  • 我应该以某种方式创建自己的循环吗? (例如,通过使用线程/进程或其他一些构造来运行与reactor分开的游戏循环)
  • 我应该以某种方式创建自己的反应堆实现吗?
答案

如果我准确地理解了这个问题,你将拥有一个Python服务器,玩家将在浏览器中播放实时FPS。你不得不:

  • 实时显示游戏
  • 在浏览器中处理用户事件
  • 将浏览器事件结果发送到服务器
  • 解析服务器上的结果
  • 将服务器事件发送到浏览器
  • 在浏览器中处理服务器事件

我们已经知道您将使用WebSockets。

实时显示游戏

您需要在某处显示图形,可能在画布内。您需要实现许多功能,例如更新健康栏,显示更改等。当您处理来自服务器的响应时,将触发这些操作。

在浏览器中处理用户事件

如果我们假设点击是射击,空间被激活等等,那么你需要一些事件处理程序。在浏览器中,您需要进行浏览器级验证。例如,如果玩家打算射击,但没有更多的弹药,那么你甚至不必向服务器发送消息,可能会显示枪的声音效果,这表示射击不成功。如果根据您在浏览器中拥有弹药的数据,那么您拍摄的方向应该发送到服务器。

将浏览器事件结果发送到服务器

当在浏览器中发生事件并进行评估时,在许多情况下,结果将被发送到服务器,服务器将处理它们并最终向浏览器发送响应。

在服务器上解析结果

服务器将有一个事件循环,并将从播放器的浏览器接收WebSocket消息。例如,如果服务器接收到射击事件,那么它将获得玩家的当前坐标和方向,计算子弹的去向并向玩家的浏览器发送消息。如果有人被击中,那么就要计算损坏并确定玩家是否死亡,随后玩家将从服务器获得WebSocket消息,随后子弹的声音将与子弹的图形显示一起显示,并且可能会显示一些血液,落下的玩家等等。

将服务器事件发送到浏览器

浏览器将从服务器侦听WebSocket消息并处理它们。

在浏览器中处理服务器事件

我们不能信任用户事件,因为可能涉及一些作弊,所以当你拍摄时,浏览器将处理事件,服务器将收到一条消息。当服务器发送WebSocket消息时,浏览器将“相信”服务器发送了准确的响应。

技术需求

您将需要浏览器中的图形API,用户事件侦听器和WebSocket侦听器。在服务器上,您将收听客户端WebSocket消息。

以上是关于在扭曲中实现联网的多人游戏循环的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 窗体中实现 gameloop [关闭]

如何在 Google App Engine 中实现互联网高分

使用 Photon Unity Network(多人游戏)在 Unity 中实时同步

如何在cocos2d-x中实现实时多人google play游戏服务c++

如何在android中实现Drag Distortion Image过滤器?

在片段中实现对话框时,必须在添加内容之前请求窗口功能