本文由CocoaChina譯者呆萌院長(博客)翻譯自蘋果開發者中心
校對:hyhSuper(GitHub)
原文:App Programming Guide for tvOS:Building Apple TV Apps--Working with Game Controllers
譯文:http://www.cocoachina.com/ios/20151130/14411.html
本文檔文章包括
Apple TV 編程指南:介紹
Apple TV 編程指南:創建Client-Server App
Apple TV 編程指南:使用Apple TV遙控器控制屏幕上的用戶界面
Apple TV 編程指南:檢測手勢和按鈕按壓
Apple TV 編程指南:設計鍵盤輸入體驗
Apple TV 編程指南:使用游戲控制器(本篇)
Apple TV 編程指南:創造視差美術資源
Apple TV 編程指南:資源管理
使用游戲控制器
和連接到 iOS 設備一樣,用戶可以通過游戲控制器連接到蘋果電視。當一個游戲控制器連接到一個蘋果電視時,控制器也可以用來控制以焦點為基礎的用戶界面。低級別控制器的輸入通過響應鏈傳遞被自動轉換為更高級別的事件。如果你的應用程序僅僅依賴 UIKit 和焦點交互,你不需要做任何工作就會支持游戲控制器。無論用戶是使用Apple TV遙控器還是游戲控制器,tvOS 會自動的處理觸摸事件。
如果你想獲得低級別的控制器輸入,可以使用游戲控制器框架。更多信息請查看《 Game Controller Programming Guide 》。
有關蘋果電視的游戲控制器框架有兩個重要的改變:
一個專門針對蘋果的電視遙控器的新的微型手柄控制器的配置文件(GCMicroGamepad)。
新增一個新的視圖控制器類(GCEventViewController),它可以通過你的應用程序控制遙控器和控制器。
支持Game Controllers框架的游戲要求
蘋果公司已經創建了針對任何支持 Game Controllers 框架游戲的特定要求。這些要求的目的是確保那些游戲總是可以玩的。
你的游戲必須支持蘋果電視遙控器。你的游戲可能不需要使用一個控制器。
tvOS游戲支持控制器必須支持擴展的控制布局。所有控制器對tvOS平台來說沒有標准適合的擴展控制器。
游戲必須可以使用獨立的控制器。如果你支持一個擴展的控制器,單獨使用這個控制器游戲必須可玩。
你必須支持暫停按鈕。所有控制器包括暫停按鈕。當游戲正在進行中時,按暫停鍵應該暫停游戲。當游戲沒有開始時,例如當你在菜單屏幕上,暫停按鈕移動到前一個屏幕上。
有限的控制器
Apple TV 最多可以同時連接兩個游戲控制器(外加一個遙控器)。你的游戲設計應當考慮到這個局限性。
使用蘋果電視遙控器作為游戲控制器
蘋果電視遙控器作為游戲控制器的能力是有限的。與其他控制器一樣,它在 Game Controller 框架中是一種 GCController 對象。遙控器支持 GCMotion 和 GCMicroGamepad 配置。只有蘋果電視遙控器支持微型游戲手柄配置文件。支持其他的游戲控制器,你還必須實現擴展的游戲手柄配置文件。
控制器具有以下特性:
遙控器上的觸摸板可以作為一個方向。方向鍵提供了模擬輸入數據。
遙控器可以在橫屏或者豎屏方向上使用。當創建APP時,你可以決定當用戶更換遙控器方向時是否自動輸入數據到配置文件對象。
通過緊緊壓在觸摸板,觸摸板可以作為一個數字按鈕(按鈕A)。
遙控器的播放/暫停按鈕是一個數字按鈕(按鈕X)。
遙控器上的菜單按鈕被用來暫停游戲,它調用控制器對象的處理暫停事件。
雖然遙控器支持運動數據(GCMotion文件),但遙控器不能決定其方向和姿勢。對應的屬性通常會返回常量值。
確定控制器輸入的目的地
在iOS平台上,當觸摸事件在設備上發生時 ,游戲控制器事件能夠同時從 Game Controller 框架中被接收。默認情況下,在 tvOS 平台上 UIKit 處理所有的低級控制器的輸入並且轉換成高級事件給響應鏈。但是,低級游戲控制器的輸入默認情況下是不可用的,原因是所有的事件都是UIKit處理的。如果你想直接的閱讀控制器的輸入,你需要關閉UIKit 的控制行為。圖6-1顯示了這兩個輸入路徑。
圖 6-1控制器的輸入目的地
例如,一個對許多游戲來說的常見設計:有一個顯示主菜單的選項的視圖,還有一個展示游戲設置界面的第二個視圖。為了與焦點行為保持一致,主菜單界面可以使用 UIKit元素實現。當游戲設置界面出現時,為了直接讀出控制器的輸入,你應該使用 Game Controller 框架關閉UIKit控制器輸入進程。
在 tvOS 平台上,如果你想要使用 Game Controller 框架來讀取低級輸入時,你需要使用 GCEventViewController 對象(或者他的子類)來展示你游戲的內容。無論何時GCEventViewController 對象的視圖或者它的子視圖成為第一響應者的時候,游戲控制器的輸入數據會被視圖控制器捕獲,並且會通過 Game Controller 框架傳遞到你的應用中。事件並沒有傳遞給 UIKit。當視圖不是視圖控制器層級的第一響應者時,正常情況下觸摸事件是由UIKit處理的。
一旦在你的響應者鏈裡有 GCEventViewController 對象時,你可以使用它的 controllerUserInteractionEnabled 屬性在事件發出的地方切換事件是否發出。例如,如果你的游戲在屏幕菜單中混合了 UIKit 內容和 Metal 內容作為視圖的一部分,那麼當游戲暫停的時候,你可以使用改變 controllerUserInteractionEnabled 屬性的值使 UIKit 獲得交互性。在這種情況下,你的游戲菜單中需要一個恢復游戲設置的按鈕,因為你控制器的暫停處理再也不會被調用了。當這個按鈕被選中時,你將會把事件處理權返回給游戲控制器,然後就可以恢復你的游戲。
如果出於某種原因,你不能使用 GCEventViewController 對象控制事件的傳遞,你可以在游戲中自己實現這個行為。你可以在視圖或者視圖控制器中重寫pressesBegan:withEvent:方法(和按壓事件的其他事件處理器一樣)。如果你想要向UIKit傳遞一個特殊事件,可調用該方法超類的實現。如果你只想由一個游戲控制器框架處理,就不要調用超類。