可收集资源 || 可视化脚本指南 + 源代码

0 点赞
RPG in a Box
转载

在本指南中,我将向你展示如何使用可视化脚本工具为你的游戏创建可采集资源(矿石 deposit、树木、钓鱼点等)。本项目的源代码也可在指南末尾找到。 简介与前提条件 请注意:本指南仅要求你了解《RPG in a Box》的基础知识。 我们不会详细介绍创建对象、 tiles、角色或地图等最基础的内容。 按照官方 wiki 上关于如何创建你的第一个项目的教程(可在官方 wiki 上找到)操作,应该能让你获得足够的程序使用经验来跟随本教程学习。 开始编写脚本之前,我们需要确保拥有所有必要的资源。本指南中将使用以下资源: 地图块: 地图瓦片 对象: 可采集资源(岩石、树木等)=> 不可通行 角色: 玩家 此外,我们还将使用以下动画: 玩家: 待机 采集

可采集资源: 默认 获取

创建地图 在进行其他操作之前,我们需要确保拥有一张地图。 进入地图编辑器,创建新地图并使用一些地图瓦片填充地面。 在本指南中,我们将使用铜矿作为可采集资源,因此需在地图某处放置铜矿。 现在在地图编辑器中使用编辑工具(F2)选择铜矿,并导航至实体属性选项卡。 为铜矿设置一个唯一的实体ID。 你还可以选择在提示窗口中显示的文本(可选)。 由于我们尚未为玩家与铜矿的交互定义任何导航类型,现在我们将进行设置。 选择连接工具(F3)。此时你应该能看到指示玩家可行走位置的绿色线条。

选择【仅交互导航类型】(橙色),并将这些橙色线条与绿色线条相连接,以便玩家能够到达铜矿并与之交互。

创建脚本(第一部分) 前往脚本编辑器。 创建新资源并选择脚本。 步骤1

我们首先为铜矿石设置一个新的实体属性。 打开【设置实体属性】节点的表达式生成器,并选择【自身】作为实体类型。 属性名称设为【可用资源量】,属性值设为5,这表示该矿石含有5份铜矿石。 现在将此节点连接到【起始节点】。 步骤2

现在从可用逻辑选项卡中选择【循环】并将其拖到网格上。 将【循环】节点连接到【设置实体属性】节点。 打开【循环】的条件表达式生成器。 对于要检查的元素,选择【自身属性】。 对于运算符,选择【大于】。 要检查的值应为【数字】。 现在在表达式字段中输入正确的数据。 由于我们要检查剩余的可用资源数量,因此应使用我们之前创建的【自身属性】availableResources。 我们希望此循环仅在资源不为空时运行,因此要检查的值为0。

步骤3

由于我们不希望玩家在挖矿时离开却仍能获取资源,所以在挖矿过程中会锁定玩家移动。 在网格中添加【锁定/解锁玩家移动】节点,并将移动设置为【锁定】状态。 确保此节点连接到【While循环】节点的【Do】接口。 步骤4

我们希望玩家在与铜矿互动时,播放我们为其创建的采集动画。 在网格中添加一个【播放动画】节点,并将其连接到【锁定/解锁玩家移动】节点。 打开【播放动画】节点的实体表达式生成器,选择【玩家】。 现在输入对应的动画名称。该名称必须与玩家角色的采集动画名称完全一致! 步骤5:为确保玩家不会一次性获得所有资源,我们将一个【等待】节点拖到网格上,并将时间设置为5秒。这将在每次获得矿石之间产生一定的延迟。

第六步

要是能有一些图形提示来显示玩家何时获得矿石就好了。 这就是我创建“获得铜矿”动画的原因。 在网格中添加一个【播放动画】节点,然后打开【实体表达式生成器】。 选择【自身】并点击确定。 现在输入对应的【动画名称】。这个名称必须与你的铜矿物体的采集动画名称相同! 步骤7:如果我们现在启动游戏,会看到玩家角色可以与铜矿互动,会显示采集动画,铜矿也会显示其采集动画,但我们还不会获得任何资源。这部分我们将在下一步处理,但首先我们应该确保到目前为止项目运行正常。保存当前脚本并返回地图编辑器。 选择编辑工具(F2)。 现在选择铜矿岩石并导航至实体属性标签页。 为该实体添加你的脚本并保存地图。 确保已配置启动脚本! 如果现在通过快速游玩测试游戏,你应该会看到类似的效果。

创建脚本(第二部分) 步骤8

为了给玩家一些铜矿,我们必须先创建一个物品。 进入物品编辑器并添加新物品。 输入物品名称和物品描述。 将物品设为可堆叠,并选择堆叠上限。 你还可以为物品设置一些标签。 保存更改并返回脚本编辑器。 步骤9

返回脚本编辑器后,在网格中添加【给予物品】节点,并将其与【播放动画】节点相连。 从下拉列表中选择物品名称,然后选择你的资源物品(在我们的示例中为铜矿石)。 将物品数量设置为1。 步骤10:既然我们已经给了玩家一些资源,我们还必须确保剩余可采集的资源减少。 要实现这一点,我们首先在网格中添加【赋值】节点。 像往常一样,将此节点与前一个节点(即【给予物品】节点)相连。 我们将创建一个名为availableResources的变量,用于存储可用资源的数量,并在之后使用该变量进行计算。 我们将给这个变量赋予与步骤1中创建的【自身属性】availableResources相同的名称。打开变量表达式生成器。 选择【自身属性】作为变量类型,并输入属性名称【availableResources】。 现在我们获取到了步骤1中为铜矿石创建的【自身属性】的值。

步骤11:在网格中添加另一个【赋值】节点,并将其连接到上一个【赋值】节点。 将变量设为availableResources。 左键点击等号(=),将其更改为减号(-=)。 打开【变量表达式生成器】,选择变量类型为【数字】,并输入值1。 现在可用资源数量已更新,并存储在availableResources变量中。 稍后我们仍需将此值存储回自身属性availableResources中(参见步骤14)。

第12步:我们希望铜矿石在采集到一块铜矿石后,采集动画播放完毕时能再次播放铜矿石的闲置动画。由于动画需要一定时间完成,我们首先要在网格中添加一个等待节点,并设置大约2秒的等待时间。确保像往常一样将此节点与前一个节点连接起来。

步骤13:在网格中添加【播放动画】节点,并将其连接到【等待】节点。打开【实体表达式生成器】,选择【自身】作为实体类型。输入你的铜矿石默认动画的【动画名称】。

第14步 由于我们的循环会在每次迭代结束时检查自身属性【availableResources】的值,因此我们必须确保将该值更新为新的可用资源总量,以避免无限循环。 在网格中添加一个【设置实体属性】节点,并将其连接到【播放动画】节点。 打开【实体表达式生成器】,选择【自身】作为实体类型。

将【availableResources】作为属性名称输入。 打开变量表达式生成器,并选择数字作为变量类型。 在变量表达式生成器的表达式字段中,输入我们的变量【availableResources】的名称。 值字段并不重要,因为该值将被我们的变量【availableResources】的值覆盖。 步骤15:现在我们已完成While循环的Do连接器设置。 你的脚本编辑器中的网格应如下所示:

如果你保存所有更改并使用快速游玩测试游戏,应该会看到角色现在每隔几秒也会获得一些铜矿,直到从岩石中采集完所有5个铜矿为止。 一个小问题是玩家角色仍在播放采集动画。 当我们采集完所有资源时能收到通知会更好。 下一步我们将通过使用循环节点的结束连接器来解决这个问题。 创建脚本(第三部分) 步骤16:导航至脚本编辑器,找到我们之前创建的循环节点。While循环的【Do】连接器已处理完毕,现在我们将专注于【End】连接器,该连接器仅在条件表达式的条件满足后执行。

由于我们已经从铜矿中收集了所有资源,现在必须重新启用玩家移动。 在网格中添加一个【锁定/解锁玩家移动】节点,并将其放置在【循环】节点附近。 将【移动状态】设置为【已解锁】。 确保此节点已连接到【循环】节点的【结束】接口! 步骤17

在网格中添加【播放动画】节点,并将其连接到上一步添加的【锁定/解锁玩家移动】节点。 打开【播放动画】节点上的【实体表达式生成器】,选择【玩家】作为实体类型。 在对应字段中输入玩家角色的闲置动画名称。 步骤18

现在剩下要做的就是在收集完所有资源时显示一条消息。只需在网格中添加一个【显示消息】节点,将其连接到上一步添加的【播放动画】节点,并输入当所有资源收集完毕时要显示给玩家的消息。你的完整网格现在应该是这样的:

本指南到此结束。 现在如果我们测试游戏,玩家角色会回到待机动画状态,同时会显示一条消息,提示已没有可采集的资源。

希望本指南能帮到你! 如果有不明白的地方或需要任何帮助,请告诉我。 源代码 set_entity_property(self, "availableResources", 5); while self.property["availableResources"] > 0 do set_player_movement_locked(true); play_animation(player, "gather"); wait(5); play_animation(self, "gain_copper_ore"); give_item("ITEM_0001"); availableResources = self.property["availableResources"]; availableResources -= 1; wait(2.2); play_animation(self, "default"); set_entity_property(self, "availableResources", availableResources) end; set_player_movement_locked(false); play_animation(player, "idle"); display_message("资源已耗尽。")