简单地说,我们现在是Redis

了解更多

如何建立一个实时地理分布多人自上而下街机射击游戏使用Redis



回到博客

随着博彩业随着规模的不断扩大,创建独特而动态的用户体验的需求变得更加迫切。由于它的狂热,企业必须最大限度地利用多人游戏体验来吸引和留住客户。然而,公司在尝试扩展多人游戏时面临许多障碍,所有这些都可以通过Redis解决。

个性化交互和高速反应是创造独特用户体验的核心。Redis为游戏发行商提供一个强大的数据库它可以支持低延迟的游戏用例。最近,一个Launchpad应用程序构建了一个独特的应用程序,由于其无与伦比的数据传输速度,该应用程序只能由Redis部署。

这一点至关重要,因为参与者来自世界各地。玩家之间的交互必须实时执行以支持游戏性,要求延迟小于一毫秒。

让我们深入了解这是如何做到的。但是在我们这样做之前,请确保浏览一下我们在发射台

  1. 你要建造什么?
  2. 你需要什么?
  3. 体系结构
  4. 开始
  5. 如何使用RedisGears功能列表
  6. 总结:积极克服地域障碍

1.你要建造什么?

您将使用Redis构建一个实时地理分布的多人自上而下的街机射击游戏。应用程序的主干是Redis,因为它是一个高效的实时数据库,使您能够存储和分发数据。

随着我们按时间顺序完成每个阶段,我们将对重要术语以及每个Redis函数进行解包。

2.你需要什么?

让我们来确定制作这款游戏所需要的不同组件。该应用程序由3个主要组件组成:

  • Redis:用作数据库、缓存和消息代理。
  • 再装备:定义游戏功能,并启用与游戏状态和用户事件的交互
  • 再研究:启用健壮的查询体验
  • JavaScript客户端:捕获用户输入并将输入发送到后端。也使用相位器3引擎渲染和物理模拟3游戏引擎
  • NodeJS后端WebSocket:用户与Redis之间的通信接口。主要用于构建游戏逻辑和启用Redis API

3.体系结构

这款多人游戏的主要理念是保持游戏的实时性,并在地理上进行推广。这意味着集群中的所有实例都应该更新,这样就不会失去同步。现在让我们看一下架构。

  • NodeJS在玩家和Redis数据库之间形成了一个通信接口。
  • JavaScript和Phaser 3库用于渲染游戏状态和通过NodeJS将用户输入传递给Redis
  • RedisGears用于启用与游戏状态和用户事件的交互

4.它是如何工作的

现在,让我们看看体系结构的流程。

  • 一切都从Javascript开始,然后通过Node JS(或WebSocket),在用户和后端Redis之间。
  • 玩家通过使用方向键操纵他们的角色通过地形
  • 导弹可以通过点击鼠标按钮向敌人发射
  • 所有这些命令都通过WebSocket发送到Redis
  • RedisGears解析这些命令并通过判断命令是否有效来更新状态
  • 这将把命令分发回其他用户和玩家
  • 如果命令错误,RedisGears将从游戏中删除某些玩家
  • 用户使用箭头键在地形中导航,并通过单击鼠标向对手发射导弹
  • 当用户执行操作时,这些命令通过WebSocket发送到RedisGears。
  • 有效的命令将通过Redis Streams重新分发给其他用户。
  • NodeJS在用户和Redis之间形成一个通信通道
  • 用户可以找到游戏并加入其中。
  • 它允许用户邀请其他用户加入游戏
  • 如果游戏不可用,它也允许用户创建新游戏。
  • RedisGears反过来支持与游戏状态和用户事件的交互
  • RedisGears解析数据,并根据用户命令确定它们应该分布在哪里。
  • 重新搜索允许用户搜索游戏

5.开始

先决条件

  • 码头工人
  • Docker-compose

克隆存储库

在存储库的根目录下,您将找到Docker compose YAML文件:

在这个YAML文件下,定义了两个主要的服务——redis和backend。

下面是Redis的Dockerfile的样子:

下面是NodeJS后端的Dockerfile:

提升服务

从online_game目录破坏以下命令

你可以通过http://127.0.0.1:8080

6.如何使用RedisGears功能列表

RedisGears有三个函数,每个函数都有自己的子函数集:

find_game函数

一旦用户启动游戏,用户要做的第一件事就是使用RedSearch搜索游戏。如果游戏存在,那么该人将尝试加入游戏。如果没有,则会触发RedisGears以创建新游戏。请参见下面的函数

一旦用户创建了一个新游戏,那么其他玩家将加入,每个人都可以玩。

create_new_game函数

如果没有游戏,则会触发RedisGears以创建新游戏。

一旦用户创建了一个新游戏,那么其他玩家将加入,每个人都可以玩。

create_new_user函数

这个函数向游戏中添加一个新玩家,其方法与Create_new_game函数相同。再次触发RedisGears,然后创建一个新用户

加入游戏功能

当用户加入游戏时,会触发RedisGears以启用Join_game函数。这也增加了game_instance (HINCRBY)的玩家计数。

leave_game函数

当用户从游戏中删除或选择离开时,RedisGears会被触发以促进这一过程。这也会自动减少玩家数量,并自动创建通知以确认该操作已完成。

玩家动作功能

在游戏过程中,玩家会发射导弹来消灭其他对手。当玩家发射导弹时,下面的子功能就会被触发:

如果导弹击中另一名玩家,那么该玩家将被从游戏中删除。下面的代码决定了玩家是否被导弹击中。

Player_actions流阅读器解释

  1. 客户端连接到node.js WebSocket服务器。
  2. 然后用户将被订阅游戏id Redis PubSub频道。3
  3. 从那时起,用户订阅的所有频道消息(在后端)也被转发到WebSocket(到前端)。
  4. MESSAGE_EVENT_HANDLERS对象存储事件>函数映射,并且在传入消息上调用一个消息事件函数(参见下面的函数列表)。

客户端消息事件处理程序列表:

MESSAGE_EVENT_HANDLERS 解释
p(姿势)参数:[用户id,x,y,方向]; 客户端接收用户id位置更新
C(点击)参数:[user_id, x(它被点击的位置),y(它被点击的位置),角度(从玩家位置到点击位置)]; 客户端接收到user_id单击事件
R (respawn) args: [user_id, x, y]; 客户端收到user_id已经重生
l(离开)参数:[用户id]; 一个客户端接收到已离开游戏的用户id
J (join) args: [user_id, x, y] 一个客户端接收到的用户id已加入游戏,并且用户id已在(x,y)位置生成
Uid(用户id) args: [is_valid]; 客户端接收是否有可能找到“登录用户”的响应
Gid(游戏id) args: [is_valid]; 如果用户是游戏的一部分,客户端将接收(用户授权)
打击args (user_id):; 客户端接收到user_id已被命中的消息/客户端可以从呈现它中删除user_id

再研究

重新搜索索引在容器启动时在redis/start\u redis.sh中注册

创建Redis搜索索引:

查询查找游戏:

结论:以显著的积极主动克服地理障碍

与任何Redis数据库一样,最受欢迎的资产之一是它能够以无与伦比的效率在组件之间传输数据。然而,在这个应用程序中,如果没有Active提供的异常延迟速度,游戏将无法正常运行。

游戏是纯互动的,来自世界各地的用户都会做出反应,向其他玩家发射导弹。从开始到结束,RedisGears根据应用程序设置的时间顺序部署一系列功能。

由于RedisGears的高效性,可以轻松完成这项工作,从而能够部署一个主动的地理分布自上而下的街机射击应用程序。

如果你想了解更多关于这个激动人心的应用程序,你可以在网站上看到完整的应用程序Redis发射台.还要确保检查所有另一个令人兴奋的应用我们有空位给你。

谁创建了这个应用程序?

Jānis威尔克斯有关

Jānis是一名大数据工程师,在航运技术公司工作。

如果你想了解更多关于他的工作和他参与的项目,那就一定要去了解点击这里查看他的GitHub个人资料

Baidu