使用智能形状制作 OrbitRun | 第 3 部分:世界变化与重玩 | hyperPad Documentation
Logo

给玩家一个明确的目标。随着游戏继续进行,紫色山丘会先变绿,再变红。90 秒时,显示玩家的距离和重玩按钮。保存玩家的最佳成绩,让他们下次有目标可以超越。

从第 2 部分继续,或从检查点资源包打开 OrbitRun-09-countdown.tap。继续在 Skimmer 的行为编辑器中操作。

重建后的游戏在实时运行中从 Luna 切换到 Aurora

在图示中,REUSE 表示使用你已经添加的行为。要回顾连接手势,请参阅第 1 部分中的连接行为。轻点图片可查看原图。

10. 穿越三个世界

游戏从 Luna Shores 开始,30 秒后切换到 Aurora Reach,60 秒后切换到 Ember Drift。山丘会保留原有的物理效果和形状,只更换外观。

构建 Aurora 的过渡效果

使用 Set Graphic,并将其目标设为生成的地形对象 ID。Smart Shape Object 参考说明了各个外观槽位的作用。

先更换顶部图形。如果成功,再更换填充图形并更新标签。

动画连接指南:Aurora:更换并检查

  1. 重用 Generate。
  2. 添加一个名为 Aurora Timer 的 Timer。将 Generate 上一个空闲的底部白色圆点连接到 Aurora Timer。
  3. 添加一个名为 Aurora Top 的 Set Graphic。将 Aurora Timer 上一个空闲的底部白色圆点连接到 Aurora Top。
  4. 添加一个名为 Aurora Top Valid 的 If。将 Aurora Top 上一个空闲的底部白色圆点连接到 Aurora Top Valid。
  5. 添加一个名为 Aurora Fill 的 Set Graphic。将 Aurora Top Valid 底部的(true)圆点连接到 Aurora Fill。
  6. 添加一个名为 Aurora Fill Valid 的 If。将 Aurora Fill 上一个空闲的底部白色圆点连接到 Aurora Fill Valid。
  7. 添加一个名为 Aurora Announce 的 Change Label。将 Aurora Fill Valid 底部的(true)圆点连接到 Aurora Announce。

使用以下设置:

  • **Aurora Timer:**30 秒;Repeat Forever 关闭;Repeat Count 设为 1;Start Immediately 关闭。
  • **Aurora Top:**目标为 Generate 的 terrainObjectID 输出;图形设为 aurora-top;Smart Shape 槽位设为 Top。
  • **Aurora Top Valid:**Aurora Top 的 smartShapeError 输出 Equals 空文本值。第二个值留空,不要加引号。
  • **Aurora Fill:**目标为 Generate 的 terrainObjectID 输出;图形设为 aurora-fill;Smart Shape 槽位设为 Middle。
  • **Aurora Fill Valid:**Aurora Fill 的 smartShapeError 输出 Equals 空文本。
  • **Aurora Announce:**目标为 Stage;文本设为 02 / AURORA REACH。

使用生成的地形 ID

选择接收行为,将源输出拖到 Object A 中,选择 terrainObjectID,然后检查生成的引用

拖放后,Object A 中会显示 Generate · terrainObjectID。对 Aurora Fill、Ember Top 和 Ember Fill 重复此操作。

检查图形更换结果

选择接收行为,将源输出拖到 First value (A) 中,选择 smartShapeError,然后检查生成的引用

拖放后,First value (A) 中会显示 Aurora Top · smartShapeError。将比较方式设为 Equals;第二个文本值留空。

注意选择图形的步骤。轻点 New graphic,打开 Graphics,然后选择 aurora-top。其缩略图应出现在属性面板中。Smart Shape 槽位保持为 Top / Road / Perimeter;配置 Aurora Fill 时,选择 Middle。

在实际资源选择器中选择 Aurora 顶部图形

Aurora Top 以 Generate 的 terrainObjectID 为目标,使用 aurora-top,并更新顶部槽位

构建 Ember 的过渡效果

按照下方指南中的名称,在 Aurora 行为旁边构建 Ember 行为。

将计时器改为 60 秒,图形改为 ember-top 和 ember-fill,并将最终标签设为 03 / EMBER DRIFT。两个对象输入都保持连接到 Generate 的 terrainObjectID 输出。检查每个 If 是否读取了它对应的 Ember 图形更换行为的输出;Ember 检查不能读取 Aurora 行为的输出。

Ember 的连接顺序与 Aurora 相同,但要检查各自对应的结果。

动画连接指南:Ember:使用它自己的检查行为

  1. 重用 Generate。
  2. 添加一个名为 Ember Timer 的 Timer。将 Generate 上一个空闲的底部白色圆点连接到 Ember Timer。
  3. 添加一个名为 Ember Top 的 Set Graphic。将 Ember Timer 上一个空闲的底部白色圆点连接到 Ember Top。
  4. 添加一个名为 Ember Top Valid 的 If。将 Ember Top 上一个空闲的底部白色圆点连接到 Ember Top Valid。
  5. 添加一个名为 Ember Fill 的 Set Graphic。将 Ember Top Valid 底部的(true)圆点连接到 Ember Fill。
  6. 添加一个名为 Ember Fill Valid 的 If。将 Ember Fill 上一个空闲的底部白色圆点连接到 Ember Fill Valid。
  7. 添加一个名为 Ember Announce 的 Change Label。将 Ember Fill Valid 底部的(true)圆点连接到 Ember Announce。

启动游戏并观察第一分钟。剩余时间大约为 60 秒时,赛道会变成绿色,Stage 显示 AURORA REACH。剩余时间大约为 30 秒时,赛道会变成暖红色,并显示 EMBER DRIFT。飞船应能继续移动,不受这两次变化影响。

在教程项目新一轮运行中呈现的 Aurora Reach

之所以能更换整个赛道,是因为 terrainObjectID 标识的是完整的 Smart Shape。现有区段会应用新图形,后续生成的区段也会使用新图形。如果你在另一个项目中想分别更改每个新区段,请使用 New Section 和 sectionObjectID。

保留两个成功检查。这样,只有在顶部和中部图形都更换成功后,Stage 标签才会更新。

11. 结束游戏并提供再次飞行的机会

进入结束状态

使用下面的三个构建指南。Run Limit 是一个 90 秒的计时器:Repeat Forever 关闭,Repeat Count 设为 1,Start Immediately 关闭。Finished 会将 Skimmer 的 runState 设为 finished。

按以下方式配置其子行为:

  • **Stop Flight (Set Behavior State):**禁用 Flight Tick
  • **Stop Hud (Set Behavior State):**禁用 Hud Tick
  • **Stop Clock (Set Behavior State):**禁用 Seconds Tick
  • **Freeze (Set Velocity):**Skimmer;X 0,Y 0;Maintain X 关闭,Maintain Y 关闭
  • **Zero Gravity (Set Gravity):**Skimmer;Object;X 0,Y 0
  • **Show Results (Set Visibility):**显示 Results Card、Results Title、Results Score、Results Tip、Replay、Replay Label
  • **Hide Cue (Set Visibility):**隐藏 Cue、Clock、Flow Label
  • **Result Score (Change Label):**目标为 Results Score;文本使用 Distance Text 的 Combined Text 输出

每个操作都应像图中所示,直接从 Finished 分支连接。

90 秒后,设置结束状态并停止更新计时器。

动画连接指南:结束:停止所有三个计时器

  1. 重用 Generate。
  2. 添加一个名为 Run Limit 的 Timer。将 Generate 上一个空闲的底部白色圆点连接到 Run Limit。
  3. 添加一个名为 Finished 的 Set Attribute。将 Run Limit 上一个空闲的底部白色圆点连接到 Finished。
  4. 添加一个名为 Stop Flight 的 Set Behavior State。将 Finished 上一个空闲的底部白色圆点连接到 Stop Flight。
  5. 添加一个名为 Stop Hud 的 Set Behavior State。将 Finished 上一个空闲的底部白色圆点连接到 Stop Hud。
  6. 添加一个名为 Stop Clock 的 Set Behavior State。将 Finished 上一个空闲的底部白色圆点连接到 Stop Clock。

现在停止飞船的运动。速度归零和重力归零需要分别连接。

动画连接指南:结束:停止飞船

  1. 重用 Finished。
  2. 添加一个名为 Freeze 的 Set Velocity。将 Finished 上一个空闲的底部白色圆点连接到 Freeze。
  3. 添加一个名为 Zero Gravity 的 Set Gravity。将 Finished 上一个空闲的底部白色圆点连接到 Zero Gravity。

再从 Finished 添加更多连接,以显示结果。

动画连接指南:结束:显示结果

  1. 重用 Finished。
  2. 添加一个名为 Show Results 的 Set Visibility。将 Finished 上一个空闲的底部白色圆点连接到 Show Results。
  3. 添加一个名为 Hide Cue 的 Set Visibility。将 Finished 上一个空闲的底部白色圆点连接到 Hide Cue。
  4. 添加一个名为 Result Score 的 Change Label。将 Finished 上一个空闲的底部白色圆点连接到 Result Score。

连接重玩功能

**属性:**Replay Touch 以 Replay 为目标,Touch Anywhere 关闭,Absorbs Touch 开启。Replay State 读取 Skimmer 的 runState。Replay Check 将该属性值与 finished 进行比较。Restart 使用 Restart Scene,Refresh 开启。

重启场景前,先检查是否处于结束状态。

动画连接指南:只有游戏结束后才能重玩

  1. 添加一个名为 Replay Touch 的 Started Touching。
  2. 添加一个名为 Replay State 的 Get Attribute。将 Replay Touch 上一个空闲的底部白色圆点连接到 Replay State。
  3. 添加一个名为 Replay Check 的 If。将 Replay State 上一个空闲的底部白色圆点连接到 Replay Check。
  4. 添加一个名为 Restart 的 Restart Scene。将 Replay Check 底部的(true)圆点连接到 Restart。

让游戏完整运行一次。飞船应停止,结果中应显示最后一次更新的距离,触碰游戏区域也不应恢复俯冲。轻点 FLY AGAIN:标题画面会重新出现,时钟会重置,下一次启动时会生成一条新赛道。

重建后的项目完整运行结束时显示的结果

停止飞船前,先将 runState 设为 finished,这样触摸检查就不会再接受输入。也要禁用飞行计时器,否则它下一次更新时可能会再次移动飞船。Freeze 中的两个 Maintain 开关都必须关闭,才能同时停止下落和向前移动。

12. 记住个人最佳成绩

重玩后,最佳成绩仍应保留。将它存入保存文件,并使用一个可在场景打开时读取的键。

读取之前的纪录

有关键、默认值和已保存数值的信息,请参阅 Load from File 和 Save to File。

  • **Load Best (Load from Save File):**放在顶层,不连接到 Generate。键设为 orbit-best-distance-v1,默认值设为 0。
  • **Best Text (Combine Text):**A = PERSONAL BEST,B = Load Best 的 Loaded Value 输出,Space 开启。
  • **Best Label (Change Label):**目标为 Menu Best;文本 = Best Text 的 Combined Text 输出。

Load Best 使用 orbit-best-distance-v1 键,默认值为 0

场景打开时读取已保存的距离,然后在标题画面上显示。

动画连接指南:读取个人最佳成绩

  1. 添加一个名为 Load Best 的 Load from Save File。
  2. 添加一个名为 Best Text 的 Combine Text。将 Load Best 上一个空闲的底部白色圆点连接到 Best Text。
  3. 添加一个名为 Best Label 的 Change Label。将 Best Text 上一个空闲的底部白色圆点连接到 Best Label。

仅保存更好的成绩

**保存设置:**Check Record 将 Distance Round 的结果与 Load Best 的 Loaded Value 进行 Greater Than 比较。Save Best 使用 Set Key,动态键为 orbit-best-distance-v1,并保存 Distance Round 的结果。Record Label 以 Results Title 为目标,文本设为 NEW PERSONAL BEST。

一轮游戏结束时,仅当成绩超过已读取的纪录时才保存。

动画连接指南:仅保存更好的距离成绩

  1. 重用 Finished。
  2. 添加一个名为 Check Record 的 If。将 Finished 上一个空闲的底部白色圆点连接到 Check Record。
  3. 添加一个名为 Save Best 的 Modify Save File。将 Check Record 底部的(true)圆点连接到 Save Best。
  4. 添加一个名为 Record Label 的 Change Label。将 Check Record 底部的(true)圆点连接到 Record Label。

完成一轮游戏。如果距离超过已读取的最佳成绩,结果标题应发生变化。重玩后,检查 Menu Best 是否显示了已保存的数字。若距离更短,原有最佳成绩应保持不变。如果你已经玩过使用相同保存键的其他 OrbitRun 项目,保存文件中可能已经有之前的成绩。

重玩后显示已读取的个人最佳成绩和音乐偏好的标题画面

在添加 m 标签之前,先比较 Distance Round 的数值。这样,保存的值仍可用于计算。将这些设置改编到其他游戏时,请为保存键使用唯一的前缀,以便每个游戏都能保存自己的成绩和偏好设置。

添加你自己的挑战

试试两分钟版本。将 Remaining 的起始值和 Run Limit 都改为 120,并将 Clock 的初始文本改为 120 s。然后决定世界应在何时切换。只更新标签的话,实际运行时限仍会是 90 秒。

继续学习第 4 部分:声音和润色,或将你的项目与检查点 12-personal-best 进行比较。