[SceneKit專題]跨平臺游戲(macOS,tvOS,watchOS)

說明

本系列文章是對<3D Apple Games by Tutorials>一書的學習記錄和體會此書對應的代碼地址

SceneKit系列文章目錄

更多iOS相關(guān)知識查看github上WeekWeekUpProject

以前面的游戲為例,將其改為跨平臺版本:

  • macOS游戲Geometry Fighter


    WX20171202-194556@2x.png
  • tvOS游戲Breaker


    WX20171202-194627@2x.png
  • watchOS游戲Geometry Fighter


    WX20171202-194641@2x.png

16-macOS游戲Geometry Fighter

創(chuàng)建項目

打開Xcode創(chuàng)建新項目,選擇macOS平臺,選擇Game類型,點擊Next繼續(xù).

WX20171202-203043@2x.png

輸入游戲名SceneKitGame,選擇Swift語言,SceneKit游戲技術(shù),取消UnitUI Tests,點擊Finish.

WX20171202-203139@2x.png

生成的項目類似于iOS項目,但不完全相同:


WX20171202-203807@2x.png
  • GameView.swift:繼承于SCNView,可以響應鼠標鍵盤事件但不能觸摸.
  • GameViewController.swift:繼承于NSViewController.
  • MainMenu.xib:控制器的xib.

選擇My Mac,運行一下游戲:

WX20171202-203823@2x.png

轉(zhuǎn)換SceneKit游戲

可以在projects/ starter/GeometryFighter/中打到原iOS版的項目.

打開iOS版項目,點擊GeometryFighter,添加新的target:

WX20171202-205516@2x.png

選擇Add Target...

WX20171202-205530@2x.png

選擇macOS平臺,然后選擇Game

WX20171202-210513@2x.png

輸入項目名GeometryFighterMac,選擇SceneKit,取消Unit TestsUI Tests,點擊Finish:

WX20171202-210528@2x.png

選擇GeometryFighterMac > My Mac作為Active Scheme.

WX20171202-210842@2x.png

運行后,看到的還是默認的飛機場景,那是因為還需要其他步驟.

多個target內(nèi)容共享

可以在iOS和macOS之間共享原來的代碼和資源.創(chuàng)建一個Shared分組

WX20171202-212027@2x.png

將下列文件和文件夾移動到Shared下面:

WX20171202-212430@2x.png

WX20171202-212449@2x.png

按住Shift鍵,選中GeometryFighter/ Shared/Particles下面的全部文件,打開右側(cè)的屬性檢查器,勾選Target Membership下面的GeometryFighterMac;這樣就能在iOS target和macOS target之間共享了.

WX20171202-213237@2x.png

Shared下面的其他幾個也是類似操作.

WX20171202-213444@2x.png

WX20171202-213503@2x.png

WX20171202-213521@2x.png

為了解決跨平臺帶來的問題,還需要添加下列代碼:

#if os(iOS)
import UIKit
#endif
#if os(macOS)
import Cocoa
#endif

當然了,我們不需要每個文件都去添加,只需要將已創(chuàng)建好的resources/ GameUtils/文件導入進來就可以了.首先,刪除一些舊文件,選中GameHelper.swiftUIColor+Extensions.swift.
右鍵--刪除--Move to Trash.
resources/ GameUtils/下面的所有文件拖放到Shared/ GameUtils/文件夾下

WX20171202-215444@2x.png

WX20171202-215540@2x.png

清理

還需要清理一下項目.選中GameView.swift, GameViewController.swiftart.scnassets.右鍵刪除--Move to Trash.

然后從示例代碼中本章節(jié)的resources/GameViewController文件夾下拖放GameView.swiftGameViewController.swift到項目中,選中Copy items if neededGeometryFighterMac,點擊Finish完成.

WX20171202-220527@2x.png

還要做的是恢復新的GameViewControllerMainMenu.xib之間的聯(lián)系.

WX20171202-221725@2x.png

鼠標輸入

選中MainMenu.xib,從右側(cè)對象庫中拖放一個Click Gesture RecognizerGame View中.

WX20171202-221925@2x.png

添加連接函數(shù):


WX20171202-222021@2x.png

現(xiàn)在還差最后一步,添加AppIcon,你可以從本章節(jié)的resources/AppIcon/文件夾中找到,拖放到Assets.xcassets中的AppIcon下:

WX20171202-222317@2x.png

運行一下程序:


WX20171202-222411@2x.png

本項目的最終完成版代碼可以在對應章節(jié)的projects/ final/GeometryFighter/下找到.

17-tvOS游戲Breaker

創(chuàng)建項目

創(chuàng)建項目


WX20171203-094525@2x.png

WX20171203-094555@2x.png

Active Scheme中選擇SceneKitGame > tvOS Simulator > Apple TV 1080p:

WX20171203-094800@2x.png

運行一下,可以看到默認的飛機模型.但是真實的Apple TV是要用遙控器操作的,怎么用呢?在模擬器的Hardware > Show Apple TV Remote中,就可以調(diào)出遙控器了:

WX20171203-095059@2x.png

移植到tvOS

在代碼中找到本章節(jié)的projects/ starter/Breaker/文件夾接著處理.

和前面類似,選中Breaker,添加新的target,在彈出窗中選擇tvOSGame.

WX20171203-095620@2x.png

WX20171203-095637@2x.png

WX20171203-095650@2x.png

WX20171203-095741@2x.png

targets間內(nèi)容共享

添加一個Shared分組,并將原來的文件拖放進來:

WX20171203-095834@2x.png

WX20171203-095850@2x.png

逐一選中文件夾下的所有文件,添加Target Membership:

WX20171203-100814@2x.png
WX20171203-100828@2x.png

WX20171203-100912@2x.png

WX20171203-100927@2x.png

還需要清理一下代碼.
選中BreakerTV/art.scnassetsBreakerTV/GameViewController.swift,刪除--Move To Trash:

添加專用代碼

打開GameViewController.swift,在setupNodes()末尾添加代碼:

#if os(tvOS)
  scnView.pointOfView = horizontalCameraNode
#endif

還有shouldAutorotate, prefersStatusBarHiddenviewWillTransition()也不需要了:

#if os(iOS)
override var shouldAutorotate: Bool {
... }
override var prefersStatusBarHidden: Bool {
... }
override func viewWillTransition(to size: CGSize, with coordinator:
  UIViewControllerTransitionCoordinator) {
... }
#endif

遙控觸摸事件

和iOS的觸摸事件不同,遙控上更接近MacBook的觸摸板的邏輯,touchesBegin()的初始位置總是(x:960, y: 540),即1080p顯示器的中心,touchesMoved()時的位置則是相對于初始點的位置.

另外還有一個問題:tvOS遙控器的觸摸板太靈敏了,輕微移動就是很長距離.我們需要在GameViewController中找到下面的代碼:

 paddleNode.position.x = paddleX +
  (Float(location.x - touchX) * 0.1)

將其更改為:

#if os(iOS)
  paddleNode.position.x = paddleX +
    (Float(location.x - touchX) * 0.1)
#elseif os(tvOS)
  paddleNode.position.x = paddleX +
    (Float(location.x - touchX) * 0.01)
#endif
圖標

圖標資源在本章節(jié)對應的resources文件夾下.

打開BreakerTV/Assets.xcassets,選中App Icon & Top Shelf Image,將圖片拖放進去:

WX20171203-110510@2x.png

運行一下,看到圖標出現(xiàn)在Apple TV首頁上了:


WX20171203-110525@2x.png

點擊進入游戲,開始玩吧:


WX20171203-111349@2x.png

18-watchOS游戲Geometry Fighter

在Xcode中,并沒有專門的watchOS版游戲的模板,我們需要做的是創(chuàng)建一個iOS的游戲,再給它添加watchOS的支持.

添加watchOS支持

我們直接在原iOS項目基礎(chǔ)上添加watchOS的target:


WX20171203-111712@2x.png

WX20171203-111736@2x.png

WX20171203-111810@2x.png

Active Scheme中選擇GeometryFighterWatch > iPhone 6s Plus + Apple Watch - 42mm

WX20171203-112044@2x.png

運行一下,看看效果:


WX20171203-112108@2x.png
targets間內(nèi)容共享

創(chuàng)建Shared文件夾,移動需要的文件

WX20171203-113835@2x.png

然后依次選中各個文件夾下面的所有文件,添加Target Membership:

WX20171203-113941@2x.png

WX20171203-114001@2x.png

WX20171203-114021@2x.png

WX20171203-114035@2x.png

添加界面控制器

首先清理項目,選中InterfaceController.swiftart.scnassets.右鍵--刪除--Move to Trash.

WX20171203-114804@2x.png

現(xiàn)在需要添加新的InterfaceController.swift.在本章節(jié)對應代碼的resources/source文件夾下,拖放到Xcode中.

WX20171203-115029@2x.png

然后建立連接:


WX20171203-115144@2x.png
添加觸摸輸入

選中Interface.storyboard,拖放一個Tap Gesture Recognizer過來.

WX20171203-115320@2x.png

建立手勢的連接:


WX20171203-115417@2x.png

現(xiàn)在已經(jīng)基本完成了.

圖標

所需圖片資源在本章節(jié)對應的resource/AppIcon文件夾下.

選中Assets.xcassets下面的AppIcon,將圖片拖放到其中:

WX20171203-115723@2x.png

運行一下,可以愉快地玩耍了!


WX20171203-115751@2x.png

項目的最終完成版本章節(jié)對應的projects/ final/GeometryFighter/文件夾下.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赠潦,更是在濱河造成了極大的恐慌,老刑警劉巖嗤谚,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泥张,居然都是意外死亡呵恢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門媚创,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人彤恶,你說我怎么就攤上這事钞钙。” “怎么了声离?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵芒炼,是天一觀的道長。 經(jīng)常有香客問我术徊,道長本刽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任赠涮,我火速辦了婚禮子寓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘笋除。我一直安慰自己斜友,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布垃它。 她就那樣靜靜地躺著鲜屏,像睡著了一般烹看。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洛史,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天惯殊,我揣著相機與錄音,去河邊找鬼也殖。 笑死土思,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的毕源。 我是一名探鬼主播浪漠,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼霎褐!你這毒婦竟也來了址愿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤冻璃,失蹤者是張志新(化名)和其女友劉穎响谓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體省艳,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡娘纷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了跋炕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赖晶。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖辐烂,靈堂內(nèi)的尸體忽然破棺而出遏插,到底是詐尸還是另有隱情,我是刑警寧澤纠修,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布胳嘲,位于F島的核電站,受9級特大地震影響扣草,放射性物質(zhì)發(fā)生泄漏了牛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一辰妙、第九天 我趴在偏房一處隱蔽的房頂上張望鹰祸。 院中可真熱鬧,春花似錦上岗、人聲如沸福荸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敬锐。三九已至背传,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間台夺,已是汗流浹背径玖。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留颤介,地道東北人梳星。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像滚朵,于是被迫代替她去往敵國和親冤灾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 說明 本系列文章是對<3D Apple Games by Tutorials>一書的學習記錄和體會此書對應的代碼地...
    蘋果API搬運工閱讀 641評論 0 1
  • Swift版本點擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,393評論 7 249
  • 簡書這一APP今天剛聽說归粉,是一位專欄作家推薦的,本想下載看看有什么好玩兒的漏峰,打開卻發(fā)現(xiàn)這是閱讀與寫作愛好者的...
    慕莫閱讀 248評論 0 0
  • 剛才看1988糠悼,韓寒的∏城牵看到他談到他的女同學們倔喂,就讓我突然想到了我的一個女同學。這個女同學很是高冷靖苇。170多滴劲,很高...
    Naleon閱讀 15,356評論 17 38
  • 感覺現(xiàn)在的自己配不上一個女孩的愛。 我自己有多不堪顾复,只有我自己知道,說真的鲁捏,我不會談戀愛芯砸,至少在我沒那么不堪之前,...
    公子不世閱讀 352評論 0 0