使用 Smart Shape 建立 OrbitRun|第 2 部分:控制飛行
Logo

你的飛船會移動了,但還不能操控它。按住畫面時,給它更強的向下拉力;放開時,再減弱拉力。等飛行手感調整到位後,加入距離分數和 90 秒倒數計時。

請從第 1 部分的專案開始,或從檢查點套件開啟 OrbitRun-05-launch.tap。以下所有行為都屬於 Skimmer。每堂課的行為都放在各自加上註解的區域中,列與欄之間要留出空間。

重建後的 OrbitRun 專案遊戲畫面錄影

在圖示中,REUSE 表示使用你已新增的行為。如需回顧手勢操作,請參閱第 1 部分的行為連接快速指南。點按圖片即可檢視完整尺寸。

6. 按住俯衝;放開滑翔

飛船朝下坡滑行時按住畫面。額外的重力會幫助它加速。在坡面轉為上坡時放開,讓速度帶它爬升。

在下坡按住,並在坡面轉為上坡時放開的圖示

首先,讓畫面觸碰在遊戲進行時改變重力。

動態連接指南:按住俯衝

以靜態圖片開啟完成的圖示。

  1. 新增 While Touching,命名為 Touch。
  2. 新增 Get Attribute,命名為 Touch State。將 Touch 底部任一空白白色圓圈連接到 Touch State。
  3. 新增 If,命名為 Touch Running。將 Touch State 底部任一空白白色圓圈連接到 Touch Running。
  4. 新增 Set Gravity,命名為 Dive。將 Touch Running 底部(true)圓圈連接到 Dive。
  5. 新增 Change Label,命名為 Dive Cue。將 Touch Running 底部(true)圓圈連接到 Dive Cue。

設定如下:

  • Touch: Input Plane;Touch Anywhere Off;Absorbs Touch On。讓它從場景開始時就持續監聽。
  • Touch State: Skimmer;屬性 runState。
  • Touch Running: 第一個值設為 Touch State 的 Attribute Value;比較方式 Equals;第二個值為 running。
  • Dive: Skimmer;重力類型 Object;X 0、Y −32。
  • Dive Cue: Cue;文字 DIVING / RELEASE AS THE HILL TURNS UP。

Dive 和 Dive Cue 都直接連接到 Touch Running 底部的連接器。右側的 false 連接器保持未使用。

將狀態拖曳到 If

選取接收行為,將來源輸出拖曳到 First value (A),選擇 attributeValue,並確認產生的參照

放開後,First value (A) 會包含 Touch State · attributeValue。將比較方式設為 Equals;第二個值設為 running。

放開手指時應恢復較輕的重力。重複使用第 1 部分的 Release。

動態連接指南:放開以滑翔

以靜態圖片開啟完成的圖示。

  1. 新增 Stopped Touching,命名為 Touch Ended。
  2. 新增 Get Attribute,命名為 Release State。將 Touch Ended 底部任一空白白色圓圈連接到 Release State。
  3. 新增 If,命名為 Release Running。將 Release State 底部任一空白白色圓圈連接到 Release Running。
  4. 重複使用 Release。將 Release Running 底部(true)圓圈連接到 Release。
  5. 重複使用 Glide Cue。保留它原本從 Release 接來的執行連線;動畫圖為了參考會重新繪製這條線。不要再新增第二條連線。

設定如下:Touch Ended 的目標為 Input Plane,Touch Anywhere Off、Absorbs Touch On、Check Boundaries Off。Release State 讀取 Skimmer 的 runState。Release Running 將該 Attribute Value 與 running 比較。

將現有的 Release 和 Glide Cue 移到 Release Running 下方。保留它們原本的連線,以及先前的啟動連線。Release 仍將物件重力設為 X 0、Y −12;Glide Cue 仍顯示滑翔提示。

在開闊的遊戲區域啟動遊戲並按住,接著抬起手指。Cue 應在 DIVING 和 GLIDING 之間切換。請避開音樂按鈕進行測試。在標題畫面按住時不應開始俯衝。

如果觸碰沒有作用,請確認 Input Plane 位於 Scene UI、在按鈕後方、覆蓋整個畫面,並且可見但不透明度為 0%。如果在原觸碰位置以外放開時沒有作用,請確認 Check Boundaries Off。

兩個觸碰檢查都會先讀取 runState,再改變重力。只有值為 running 時才允許俯衝。加入結束機制後,這些檢查也會讓飛船保持靜止。

7. 讓飛船朝向速度方向

飛船下墜時應朝下,爬升時應朝上。啟動一個重複計時器來讀取速度。你稍後也會用同一個速度讀數,協助飛船在緩慢著陸時恢復速度。

先讀取速度,再檢查兩種速度限制。兩個檢查都從 Velocity 開始。

動態連接指南:先檢查速度,再變更速度

以靜態圖片開啟完成的圖示。

  1. 重複使用 Generate。
  2. 新增 Timer,命名為 Flight Tick。將 Generate 底部任一空白白色圓圈連接到 Flight Tick。
  3. 新增 Get Velocity,命名為 Velocity。將 Flight Tick 底部任一空白白色圓圈連接到 Velocity。
  4. 新增 If,命名為 Slow Check。將 Velocity 底部任一空白白色圓圈連接到 Slow Check。
  5. 新增 If,命名為 Fast Check。將 Velocity 底部任一空白白色圓圈連接到 Fast Check。
  6. 新增 Set Velocity,命名為 Assist。將 Slow Check 底部(true)圓圈連接到 Assist。
  7. 新增 Set Velocity,命名為 Speed Limit。將 Fast Check 底部(true)圓圈連接到 Speed Limit。

設定如下:

  • Flight Tick: 0.05 秒;Repeat Forever On;Start Immediately Off。Generate 的觸發條件維持 Ready。
  • Velocity: 目標為 Skimmer。
  • Slow Check: Velocity 的 X Velocity < 8。Assist: X 12、Maintain X Off、Maintain Y On。
  • Fast Check: Velocity 的 X Velocity > 42。Speed Limit: X 42、Maintain X Off、Maintain Y On。

檢查行為放在效果行為上方。Slow Check 和 Fast Check 是 Velocity 各自獨立的子行為。

將 X 速度拖曳到檢查中

選取接收行為,將來源輸出拖曳到 First value (A),選擇 velocity_x,並確認產生的參照

放開後,First value (A) 會包含 Velocity · velocity_x。將比較方式設為 Is Less Than;第二個值設為 8。

以下是同一個拖曳操作在實際編輯器中的示範。先選取 Slow Check。將 Velocity 的綠色輸出圖示拖曳到第一個輸入欄位,然後選擇 velocity_x。

編輯器操作錄影:將 Velocity 拖曳到 Slow Check

Slow Check 中完成的輸入參照

請參閱在行為之間共用數值和 If。輸入欄位內的綠色按鈕會建立 Change Input Field 行為;執行此拖曳時,請使用來源行為的輸出圖示。

使用相同的速度讀數來計算飛船角度。

動態連接指南:朝移動方向轉向

以靜態圖片開啟完成的圖示。

  1. 重複使用 Velocity。
  2. 新增 If,命名為 Angle Moving。將 Velocity 底部任一空白白色圓圈連接到 Angle Moving。
  3. 新增 Divide Values,命名為 Slope Ratio。將 Angle Moving 底部(true)圓圈連接到 Slope Ratio。
  4. 新增 Math Function,命名為 Flight Angle。將 Slope Ratio 底部任一空白白色圓圈連接到 Flight Angle。
  5. 新增 Multiply Values,命名為 Clockwise Angle。將 Flight Angle 底部任一空白白色圓圈連接到 Clockwise Angle。
  6. 新增 Rotate To Angle,命名為 Rotate。將 Clockwise Angle 底部任一空白白色圓圈連接到 Rotate。

設定如下:

  • Angle Moving: Velocity 的 X Velocity > 0.1。
  • Slope Ratio: 第一個數值 = Velocity 的 Y Velocity;第二個數值 = Velocity 的 X Velocity。
  • Flight Angle: Arctangent,輸入 Slope Ratio 的結果。
  • Clockwise Angle: 第一個數值 = Flight Angle 的結果;第二個數值 = −1。
  • Rotate: 目標為 Skimmer;角度 = Clockwise Angle 的結果。設定較短的持續時間,讓轉向更平順。

每個參照數值都要使用綠色輸出拖曳功能。不要在數值欄位中輸入公式。請使用行為計算,再將結果放入接收欄位。

不觸碰畫面,遊玩幾個坡面。飛船在下坡時應機頭朝下,在爬升時應機頭朝上。即使速度變慢,它也應繼續移動。

角度是以 atan(vy / vx) 計算。先檢查 X 速度,可避免除以零。乘以 −1 會讓結果轉向 hyperPad 使用的旋轉方向。

此計算假設飛船向前移動。如果要改成向後飛行,也需要考慮方向,可使用 atan2 或依象限分別檢查。

助推和限速只會改變水平速度。維持 Y 速度可保留目前的跳躍或下墜狀態。42 是 X 速度上限,因此在陡峭俯衝時,稍後顯示的總速度可能會超過 42。

8. 將世界座標轉換成分數

你的分數代表飛船水平移動的距離。用目前的世界 X 座標減去起始 X 座標。攝影機可以自由移動,不會影響分數。

這條連線會讀取飛船位置,並將它轉成距離標籤。

動態連接指南:將位置轉換成距離

以靜態圖片開啟完成的圖示。

  1. 重複使用 Generate。
  2. 新增 Timer,命名為 Hud Tick。將 Generate 底部任一空白白色圓圈連接到 Hud Tick。
  3. 新增 Get Position,命名為 Position。將 Hud Tick 底部任一空白白色圓圈連接到 Position。
  4. 新增 Subtract Values,命名為 Distance Value。將 Position 底部任一空白白色圓圈連接到 Distance Value。
  5. 新增 Round Number,命名為 Distance Round。將 Distance Value 底部任一空白白色圓圈連接到 Distance Round。
  6. 新增 Combine Text,命名為 Distance Text。將 Distance Round 底部任一空白白色圓圈連接到 Distance Text。
  7. 新增 Change Label,命名為 Distance Label。將 Distance Text 底部任一空白白色圓圈連接到 Distance Label。

設定如下:

  • Hud Tick: 0.2 秒;Repeat Forever On;Start Immediately Off。
  • Position: Skimmer;Screen Coordinates Off。
  • Distance Value: 第一個數值 = Position 的 X Position;第二個數值 = 8。
  • Distance Round: Distance Value 的結果;模式 Floor。
  • Distance Text: 第一個輸入 = Distance Round 的結果;第二個輸入 = m;Space On。
  • Distance Label: 目標為 Distance;文字 = Distance Text 的 Combined Text。

Hud Tick 設定

在計算中使用世界座標 X

選取接收行為,將來源輸出拖曳到 First number (A),選擇 position_x,並確認產生的參照

放開後,First number (A) 會包含 Position · position_x。第二個數值維持 8:目前 X 減去起始 X。

將速度顯示新增為 Hud Tick 的另一條獨立連線。

動態連接指南:第二個 HUD 分支

以靜態圖片開啟完成的圖示。

  1. 重複使用 Hud Tick。
  2. 新增 Round Number,命名為 Speed Round。將 Hud Tick 底部任一空白白色圓圈連接到 Speed Round。
  3. 新增 Combine Text,命名為 Speed Text。將 Speed Round 底部任一空白白色圓圈連接到 Speed Text。
  4. 新增 Change Label,命名為 Speed Label。將 Speed Text 底部任一空白白色圓圈連接到 Speed Label。

設定如下:Speed Round 讀取 Velocity 的 Speed 輸出,並使用 Floor。Speed Text 將 Speed Round 的結果與 m/s 組合,並開啟 Space On。Speed Label 的目標為 Speed,並讀取 Speed Text 的 Combined Text。

將 Velocity 的資料拖曳到 Speed Round 的數值欄位。執行連線則來自 Hud Tick,如圖所示。讀取 Velocity 的數值不需要從 Velocity 到 Speed Round 的執行連線。

啟動遊戲並觀察 Distance 從接近零開始增加。當世界座標 X 為 108 m 時,顯示的距離應為 100 m,因為飛船從 X 8 m 開始。攝影機移動不應重設分數。

Hud Tick 會讀取 Velocity 的最新結果。它每秒更新標籤五次,而飛行檢查的執行頻率更高。你可以降低顯示更新頻率,而不影響飛船的物理運動。

Set Label 參考文件說明了標籤變更行為(在此編輯器中標示為 Change Label)。

9. 從 90 秒開始倒數

像其他計時器一樣,從 Ready 啟動秒數計時器。

動態連接指南:建立倒數計時

以靜態圖片開啟完成的圖示。

  1. 重複使用 Generate。
  2. 新增 Timer,命名為 Seconds Tick。將 Generate 底部任一空白白色圓圈連接到 Seconds Tick。
  3. 新增 Add Values,命名為 Seconds。將 Seconds Tick 底部任一空白白色圓圈連接到 Seconds。
  4. 新增 Subtract Values,命名為 Remaining。將 Seconds 底部任一空白白色圓圈連接到 Remaining。
  5. 新增 Combine Text,命名為 Clock Text。將 Remaining 底部任一空白白色圓圈連接到 Clock Text。
  6. 新增 Change Label,命名為 Clock Label。將 Clock Text 底部任一空白白色圓圈連接到 Clock Label。

設定如下:Seconds Tick 設為 1 秒、Repeat Forever On、Start Immediately Off。Seconds 將 1 加到自身前一次的結果,初始值為 0。Remaining 用 90 減去 Seconds 的結果。Clock Text 將 Remaining 的結果與 s 組合,並開啟 Space On。Clock Label 的目標為 Clock,文字使用 Clock Text 的 Combined Text。

使用行為本身的結果

選取接收行為,將來源輸出拖曳到 First number (A),選擇 final value,並確認產生的參照

放開後,First number (A) 會包含 Seconds · final value。第二個數值維持 1。初始結果:0。

Seconds 在第一個輸入中使用自己的結果

若要參照自身,請保持選取 Seconds,再將 Seconds 自己的綠色輸出圖示拖曳到第一個數值欄位。選擇它的結果(在輸出參照中顯示為 final value)。將第二個數值設為 1。第一次計時觸發時,時鐘會從 90 s 變成 89 s。

請參閱 Timer,了解重複和立即啟動設定。

三種更新間隔及其各自的用途

在標題畫面停留幾秒。時鐘應維持在 90 s。啟動遊戲後,它應每秒倒數一次。請在歸零前停止測試;你會在第 3 部分加入結束機制。

在這個原型中,你透過計算 Timer 事件來追蹤經過的秒數。如果你的遊戲需要在中斷期間精確計時,請改用時鐘讀取經過時間。Timer 事件可能會延遲觸發。

打造專屬手感

每次實驗只更改一個數值,然後重新遊玩:

  • 將 Dive 重力從 −32 改為 −24。按住時是否感覺沒那麼強烈?
  • 將助推值從 12 改為 10。著陸不理想時,遊戲是否感覺更難?
  • 將 Hud Tick 從 0.2 改為 0.5 秒。注意顯示會變得不那麼平順,但飛船仍正常移動。

在開始第 3 部分:世界變化與重新遊玩前,請還原教學中的數值。如果你的版本有差異,請與檢查點 09-countdown 比較。