Golang+Protobuf+PixieJS 开发 Web 多人在线射击游戏(原创翻译)

简介
Superstellar 是一款开源的多人 Web 太空游戏,非常适合入门 Golang 游戏服务器开发。
规则很简单:摧毁移动的物体,不要被其他玩家和小行星杀死。你拥有两种资源 — 生命值(health points)和能量值(energy points)。每次撞击和与小行星的接触都会让你失去生命值。在射击和使用提升驱动时会消耗能量值。你杀死的对象越多,你的生命值条就会越长。
在这里插入图片描述
技术栈

游戏分为两个部分:一个中央服务器(central server)和一个在每个客户端的浏览器中运行的前端应用程序(a front end app)。

我们之所以选择这个项目,主要是因为后端部分。 我们希望它是一个可以同时发生许多事情的地方:游戏模拟(game simulation),客户端网络通信(client network communication),统计信息(statistics),监视(monitoring)等等。 所有这些都应该并行高效地运行。因此,Go 以并发为导向的方法和轻量级的方式似乎是完成此工作的理想工具。

前端部分虽然很重要,但并不是我们的主要关注点。然而,我们也发现了一些潜在的有趣问题,如如何利用显卡渲染动画或如何做客户端预测,以使游戏运行平稳和良好。最后我们决定尝试包含:JavaScript, webpack 和 PixieJS 的堆栈。

在本文的其余部分中,我将讨论后端部分,而客户端应用程序将留待以后讨论。

游戏状态主控模拟 - 在一个地方,而且只有一个地方

Superstellar 是一款多人游戏,所以我们需要一个逻辑来决定游戏世界的当前状态及其变化。它应该了解所有客户端的动作,并对发生的事件做出最终决定 — 例如,炮弹是否击中目标或两个物体碰撞的结果是什么。我们不能让客户端这样做,因为可能会发生两个人对是否有人被枪杀的判断不同。更不用说那些想要破解协议并获得非法优势的恶意玩家了。因此,存储游戏状态并决定其变化的最佳位置是服务器本身。

下面是服务器工作方式的总体概述。它同时运行三种不同类型的动作:

  • 侦听来自客户端的控制输入
  • 运行仿真模拟(simulation)以将状态更新到下一个时间点
  • 向客户端发送当前状态更新

在这里插入图片描述
下图显示了飞船的状态和用户输入结构的简化版本。 用户可以随时发送消息,因此可以修改用户输入结构。仿真步骤每 20 毫秒唤醒一次,并执行两个操作。 首先,它需要用户输入并更新状态(例如,如果用户启用了推力,则增加加速度)。 然后,它获取状态(在 t 时刻)并将其转换为时间的下一个时刻(t + 1)。 整个过程重复进行。

在这里插入图片描述
在 Go 中实现这种并行逻辑非常容易 — 多亏了它的并发特性。每个逻辑都在其自己的 goroutine 中运行,并侦听某些通道(channel),以便从客户端获取数据或同步到 tickers,以定义模拟步骤(simulations steps)的速度或将更新发送回客户端。我们也不必担心并行性 - Go 会自动利用所有可用的 CPU 内核。goroutine 和通道(channels)的概念很简单,但是功能强大。

与客户端通信

服务器通过 websockets 与客户端通信。由于有了 Gorilla web toolkit,在 Golang 使用 websockets 既简单又可靠。还有一个原生的 websocket 库,但是它的官方文档说它目前缺少一些特性,因此推荐使用 Gorilla。
为了让 websocket 运行,我们必须编写一个 handler 函数来获取初始的客户端请求,建立 websocket 连接并创建一个 client 结构体:
superstellar_websocket_handler.go

handler := func(w http.ResponseWriter, r *http.Request) {
   
  conn, err := s.upgrader.Upgrade
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Wails 是一个使用 Go 编程语言创建跨平台本机应用程序的框架,它允许您使用 Go 编写前端和后端代码。Wails 提供了一个简单的方式来构建具有本机外观和感觉的应用程序,可以在所有主要平台上运行,包括 Windows、macOS 和 Linux。 要使用 Wails 开发 UI 窗口,可以遵循以下步骤: 1. 安装 Wails 首先,您需要安装 Wails。您可以访问官方网站 https://wails.app/ ,根据您的操作系统选择对应的安装包进行安装。 2. 创建新项目 使用 `wails init` 命令在您的工作目录中创建新项目。该命令将生成一个基本的 Wails 项目结构。 3. 创建 UI 窗口 在项目的 `frontend` 目录下创建一个 HTML 文件,该文件将作为窗口的 UI 界面。您可以使用 HTML、CSS 和 JavaScript 来创建您的 UI 界面。Wails 使用 Go 的 Webview 库来呈现 UI 界面。 4. 连接前端和后端 在项目的 `backend` 目录下创建一个 Go 文件,该文件将作为窗口的后端处理逻辑。您可以使用 Go 编写您的业务逻辑,并将其与前端交互。Wails 提供了一些方便的方法来实现前后端之间的通信。 5. 构建应用程序 使用 `wails build` 命令构建您的应用程序。该命令将生成适用于您的操作系统和架构的二进制文件。 6. 运行应用程序 使用 `./<yourapp>` 命令运行您的应用程序。您将看到一个带有本机外观和感觉的 UI 界面,可以在其中与您的后端进行交互。 以上是使用 Wails 开发 UI 窗口的基本步骤。您可以使用 Wails 提供的其他功能来扩展您的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值