GMCloud和GameMaker第2部分:游戏配置

已发布游戏的缺点在于它已经完成。 这是一个完整的程序包。 您将其投放到世界上,然后玩家开始玩游戏。 如果您想发送重新平衡的游戏,请稍稍更改游戏的配置,那么您就必须以某种方式跟踪您的玩家,并要求他们将其更新为新版本。 这似乎是很多工作。

相反,如果您的游戏可以使用您可以控制的在线服务器进行检入并获取您提供的最新配置,那么它将变得更加容易和有用。 这提供了多种可能性,然后您将能够:

  • 每日消息(MotD):向播放器显示的一则小消息。 这可能就像显示一条消息来提醒玩家在发布新版本时升级游戏一样简单。
  • 定时解锁和特殊事件:也许在特定时间解锁了游戏的新区域或新功能。 您不希望玩家能够快进系统时钟并愚弄游戏,以为它已经成为未来。
  • 游戏平衡:也许您希望能够重新平衡游戏中的统计数据或调整某些游戏参数。 通常,您需要发送一个新的更新来执行此操作,但是相反,从服务器获取游戏平衡值将允许您在游戏的每个副本上更新游戏平衡,而无需更新玩家。

本教程介绍了如何从GameMaker Studio 2项目中的GMCloud中提取游戏配置。 假定您已在第1部分中设置了秘密和gmcloud_handler

步骤1:撰写讯息

在深入研究GML代码之前,您应该设置一些实际数据以提取GMCloud(默认情况下为空白)。 在网站的GameDev部分中转到您的游戏,向下滚动到“ Game Config”,然后输入一些数据。 在本教程中,我将使用一些JSON编码的数据轻松将其转换为ds_map。

其他格式也是可能的,例如:

  • 纯文本:也许您不需要任何花哨的内容,只需显示一个字符串
  • ini:您可以像编写ini文件一样编写ini数据,并使用GameMaker ini_open_from_string()
  • 缓冲区:您可以存储base64编码的缓冲区,并具有GameMaker buffer_base64_decode()
  • ds_grid或其他数据结构:GameMaker的ds_grid_read()和其他数据结构的其他_read()函数使用基于字符串的序列化。 您可以在GM程序中生成网格数据,使用ds_grid_write()写出序列化的版本,然后将结果复制到配置中。
  • 任何其他字符串序列化的数据:只要是字符串,并且您具有适当的反序列化器,则任何数据都是可能的

大小限制约1MB

步骤2:发出游戏配置请求

在游戏中的某个时刻,只需向配置发出一次请求:

  uuid = gmcloud_get_config(); 

而已! gmcloud_get_config()带任何参数。 它将使用您在gmcloud_handler对象中设置的机密,并向GMCloud请求游戏配置。

注意:确保仅运行一次! 如果您以60fps的速度每一步运行它,那么服务器将对您不满意,而我会很不高兴。 请参阅可能的实现的附录,以了解实现此方法的方法。

返回的值(此处存储在变量uuid )是“请求ID”。 它还不是实际的游戏配置-请求和下载配置需要花费几帧,并且由于互联网的不确定性,很难准确预测这将花费多长时间,因此会返回此uuid变量并用于定期检查以查看请求的游戏配置是否已到达。 这种异步轮询的工作原理图如下所示:

乍一看,这可能会占用大量资源,但在ds_map_exists()进行的每次轮询仅是一个ds_map_exists() ,因此即使您有多个同时请求,资源占用也很少。

步骤3:检查结果

一旦获取到请求ID,这意味着该请求已被触发到GMCloud服务器,而所需要做的就是坐下来等待响应。

我们会定期使用此请求ID进行轮询,以查看结果是否存在。 可以使用以下方法完成:

 如果(gmcloud_result_exists(uuid)){ 
...
}

每帧都运行一次是很好的,因为这样做不需要太多资源。

步骤4:取得结果

确认相关请求ID存在结果后,我们可以使用以下方法获取结果数据:

 如果(gmcloud_result_exists(uuid)){ 
var result = gmcloud_result_pop(uuid);
// ...对结果有所作为
}

可变result现在包含请求的数据,在这种情况下,您是在步骤1中设置的游戏配置。

注意:如果我们没有在if语句中完成gmcloud_result_pop(uuid) ,那么结果将仍然坐在那里等待我们抓取它,并且gmcloud_result_exists(uuid)将继续返回true直到我们这样做。

步骤5:解析结果

现在我们有了完整的配置字符串,因为在此示例中,我们设置了JSON格式的字符串以方便访问数据,因此我们需要在结果上运行json_decode()以将数据放入地图中。 出于演示目的,我们将show_message消息,并更新一些假定为统计信息更新已存在的全局值。

 如果(gmcloud_result_exists(uuid)){ 
var result = gmcloud_result_pop(uuid);
var data = json_decode(result);

show_message(data [?“ motd”]);;
global.some_stat =数据[? “ some_stat”];
}

这个非常简单的示例显示了从GMCloud获取和解码游戏配置所需的最低限度。 在实际的实现中,您可能希望更好地处理可能的错误情况。

该扩展包括一些演示对象,它们具有适度更完整的实现作为示例。

在第3部分中,我们将研究如何链接用户的个人资料,以便您可以开始访问播放器数据。