使用 Smart Shape 建立 OrbitRun|第 2 部分:控制飛行
你的飛船會移動了,但還不能操控它。按住畫面時,給它更強的向下拉力;放開時,再減弱拉力。等飛行手感調整到位後,加入距離分數和 90 秒倒數計時。
請從第 1 部分的專案開始,或從檢查點套件開啟 OrbitRun-05-launch.tap。以下所有行為都屬於 Skimmer。每堂課的行為都放在各自加上註解的區域中,列與欄之間要留出空間。
在圖示中,REUSE 表示使用你已新增的行為。如需回顧手勢操作,請參閱第 1 部分的行為連接快速指南。點按圖片即可檢視完整尺寸。
6. 按住俯衝;放開滑翔
飛船朝下坡滑行時按住畫面。額外的重力會幫助它加速。在坡面轉為上坡時放開,讓速度帶它爬升。
首先,讓畫面觸碰在遊戲進行時改變重力。
- 新增 While Touching,命名為 Touch。
- 新增 Get Attribute,命名為 Touch State。將 Touch 底部任一空白白色圓圈連接到 Touch State。
- 新增 If,命名為 Touch Running。將 Touch State 底部任一空白白色圓圈連接到 Touch Running。
- 新增 Set Gravity,命名為 Dive。將 Touch Running 底部(true)圓圈連接到 Dive。
- 新增 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) 會包含 Touch State · attributeValue。將比較方式設為 Equals;第二個值設為 running。
放開手指時應恢復較輕的重力。重複使用第 1 部分的 Release。
- 新增 Stopped Touching,命名為 Touch Ended。
- 新增 Get Attribute,命名為 Release State。將 Touch Ended 底部任一空白白色圓圈連接到 Release State。
- 新增 If,命名為 Release Running。將 Release State 底部任一空白白色圓圈連接到 Release Running。
- 重複使用 Release。將 Release Running 底部(true)圓圈連接到 Release。
- 重複使用 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 開始。
- 重複使用 Generate。
- 新增 Timer,命名為 Flight Tick。將 Generate 底部任一空白白色圓圈連接到 Flight Tick。
- 新增 Get Velocity,命名為 Velocity。將 Flight Tick 底部任一空白白色圓圈連接到 Velocity。
- 新增 If,命名為 Slow Check。將 Velocity 底部任一空白白色圓圈連接到 Slow Check。
- 新增 If,命名為 Fast Check。將 Velocity 底部任一空白白色圓圈連接到 Fast Check。
- 新增 Set Velocity,命名為 Assist。將 Slow Check 底部(true)圓圈連接到 Assist。
- 新增 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 · velocity_x。將比較方式設為 Is Less Than;第二個值設為 8。
以下是同一個拖曳操作在實際編輯器中的示範。先選取 Slow Check。將 Velocity 的綠色輸出圖示拖曳到第一個輸入欄位,然後選擇 velocity_x。
請參閱在行為之間共用數值和 If。輸入欄位內的綠色按鈕會建立 Change Input Field 行為;執行此拖曳時,請使用來源行為的輸出圖示。
使用相同的速度讀數來計算飛船角度。
- 重複使用 Velocity。
- 新增 If,命名為 Angle Moving。將 Velocity 底部任一空白白色圓圈連接到 Angle Moving。
- 新增 Divide Values,命名為 Slope Ratio。將 Angle Moving 底部(true)圓圈連接到 Slope Ratio。
- 新增 Math Function,命名為 Flight Angle。將 Slope Ratio 底部任一空白白色圓圈連接到 Flight Angle。
- 新增 Multiply Values,命名為 Clockwise Angle。將 Flight Angle 底部任一空白白色圓圈連接到 Clockwise Angle。
- 新增 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 座標。攝影機可以自由移動,不會影響分數。
這條連線會讀取飛船位置,並將它轉成距離標籤。
- 重複使用 Generate。
- 新增 Timer,命名為 Hud Tick。將 Generate 底部任一空白白色圓圈連接到 Hud Tick。
- 新增 Get Position,命名為 Position。將 Hud Tick 底部任一空白白色圓圈連接到 Position。
- 新增 Subtract Values,命名為 Distance Value。將 Position 底部任一空白白色圓圈連接到 Distance Value。
- 新增 Round Number,命名為 Distance Round。將 Distance Value 底部任一空白白色圓圈連接到 Distance Round。
- 新增 Combine Text,命名為 Distance Text。將 Distance Round 底部任一空白白色圓圈連接到 Distance Text。
- 新增 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。
在計算中使用世界座標 X
放開後,First number (A) 會包含 Position · position_x。第二個數值維持 8:目前 X 減去起始 X。
將速度顯示新增為 Hud Tick 的另一條獨立連線。
- 重複使用 Hud Tick。
- 新增 Round Number,命名為 Speed Round。將 Hud Tick 底部任一空白白色圓圈連接到 Speed Round。
- 新增 Combine Text,命名為 Speed Text。將 Speed Round 底部任一空白白色圓圈連接到 Speed Text。
- 新增 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 啟動秒數計時器。
- 重複使用 Generate。
- 新增 Timer,命名為 Seconds Tick。將 Generate 底部任一空白白色圓圈連接到 Seconds Tick。
- 新增 Add Values,命名為 Seconds。將 Seconds Tick 底部任一空白白色圓圈連接到 Seconds。
- 新增 Subtract Values,命名為 Remaining。將 Seconds 底部任一空白白色圓圈連接到 Remaining。
- 新增 Combine Text,命名為 Clock Text。將 Remaining 底部任一空白白色圓圈連接到 Clock Text。
- 新增 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) 會包含 Seconds · final value。第二個數值維持 1。初始結果:0。
若要參照自身,請保持選取 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 比較。

