在扭曲的

时间:2019-03-04 09:14:07

标签: python twisted

我正在从事游戏项目,因此我决定继续使用扭曲的服务器部分。

它是一款多人射击游戏。

现在我想将主循环集成到游戏中(在服务器端)以处理输入和物理(用于子弹和玩家)。输入是通过websocket从客户端接收的。 我想让游戏循环运行游戏。 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语句将永远阻塞反应堆。因此,在基于偶数的情况下,我们该怎么做才能实现扭曲的循环)

在同一篇文章的底部,提到了以下几点:

  

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

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

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

1 个答案:

答案 0 :(得分:0)

如果我能正确理解问题,则您将拥有一个Python服务器,并且播放器将在浏览器中播放实时FPS。您将必须:

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

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

实时显示游戏

您需要将图形显示在某个地方,也许在画布内。您将需要实现许多功能,例如更新运行状况栏,显示更改等。当您处理服务器的响应时,将触发这些事件。

在浏览器中处理用户事件

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

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

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

在服务器上解析结果

服务器将具有事件循环,并将从播放器的浏览器接收WebSocket消息。例如,如果服务器接收到射击事件,则它将获取玩家的当前坐标和方向,计算子弹的位置并将消息发送到玩家的浏览器。如果有人被击中,则要计算伤害并确定玩家是否死亡,随后玩家将从服务器获取WebSocket消息,随后将显示子弹的声音以及子弹的图形显示以及可能会掉落的鲜血玩家等等。

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

浏览器将侦听来自服务器的WebSocket消息并进行处理。

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

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

技术需求

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