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

說明

本系列文章是對(duì)<3D Apple Games by Tutorials>一書的學(xué)習(xí)記錄和體會(huì)此書對(duì)應(yīng)的代碼地址

SceneKit系列文章目錄

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

以前面的游戲?yàn)槔?將其改為跨平臺(tái)版本:

  • 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)建項(xiàng)目

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

WX20171202-203043@2x.png

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

WX20171202-203139@2x.png

生成的項(xiàng)目類似于iOS項(xiàng)目,但不完全相同:


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

選擇My Mac,運(yùn)行一下游戲:

WX20171202-203823@2x.png

轉(zhuǎn)換SceneKit游戲

可以在projects/ starter/GeometryFighter/中打到原iOS版的項(xiàng)目.

打開iOS版項(xiàng)目,點(diǎn)擊GeometryFighter,添加新的target:

WX20171202-205516@2x.png

選擇Add Target...

WX20171202-205530@2x.png

選擇macOS平臺(tái),然后選擇Game

WX20171202-210513@2x.png

輸入項(xiàng)目名GeometryFighterMac,選擇SceneKit,取消Unit TestsUI Tests,點(diǎn)擊Finish:

WX20171202-210528@2x.png

選擇GeometryFighterMac > My Mac作為Active Scheme.

WX20171202-210842@2x.png

運(yùn)行后,看到的還是默認(rèn)的飛機(jī)場(chǎng)景,那是因?yàn)檫€需要其他步驟.

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

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

WX20171202-212027@2x.png

將下列文件和文件夾移動(dòng)到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下面的其他幾個(gè)也是類似操作.

WX20171202-213444@2x.png

WX20171202-213503@2x.png

WX20171202-213521@2x.png

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

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

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

WX20171202-215444@2x.png

WX20171202-215540@2x.png

清理

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

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

WX20171202-220527@2x.png

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

WX20171202-221725@2x.png

鼠標(biāo)輸入

選中MainMenu.xib,從右側(cè)對(duì)象庫中拖放一個(gè)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

運(yùn)行一下程序:


WX20171202-222411@2x.png

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

17-tvOS游戲Breaker

創(chuàng)建項(xiàng)目

創(chuàng)建項(xiàng)目


WX20171203-094525@2x.png

WX20171203-094555@2x.png

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

WX20171203-094800@2x.png

運(yùn)行一下,可以看到默認(rèn)的飛機(jī)模型.但是真實(shí)的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)容共享

添加一個(gè)Shared分組,并將原來的文件拖放進(jìn)來:

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()時(shí)的位置則是相對(duì)于初始點(diǎn)的位置.

另外還有一個(gè)問題:tvOS遙控器的觸摸板太靈敏了,輕微移動(dòng)就是很長距離.我們需要在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
圖標(biāo)

圖標(biāo)資源在本章節(jié)對(duì)應(yīng)的resources文件夾下.

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

WX20171203-110510@2x.png

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


WX20171203-110525@2x.png

點(diǎn)擊進(jìn)入游戲,開始玩吧:


WX20171203-111349@2x.png

18-watchOS游戲Geometry Fighter

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

添加watchOS支持

我們直接在原iOS項(xiàng)目基礎(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

運(yùn)行一下,看看效果:


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

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

WX20171203-113835@2x.png

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

WX20171203-113941@2x.png

WX20171203-114001@2x.png

WX20171203-114021@2x.png

WX20171203-114035@2x.png

添加界面控制器

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

WX20171203-114804@2x.png

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

WX20171203-115029@2x.png

然后建立連接:


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

選中Interface.storyboard,拖放一個(gè)Tap Gesture Recognizer過來.

WX20171203-115320@2x.png

建立手勢(shì)的連接:


WX20171203-115417@2x.png

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

圖標(biāo)

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

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

WX20171203-115723@2x.png

運(yùn)行一下,可以愉快地玩耍了!


WX20171203-115751@2x.png

項(xiàng)目的最終完成版本章節(jié)對(duì)應(yīng)的projects/ final/GeometryFighter/文件夾下.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 說明 本系列文章是對(duì)<3D Apple Games by Tutorials>一書的學(xué)習(xí)記錄和體會(huì)此書對(duì)應(yīng)的代碼地...
    蘋果API搬運(yùn)工閱讀 722評(píng)論 0 1
  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 26,110評(píng)論 7 249
  • 簡書這一APP今天剛聽說,是一位專欄作家推薦的,本想下載看看有什么好玩兒的,打開卻發(fā)現(xiàn)這是閱讀與寫作愛好者的...
    慕莫閱讀 296評(píng)論 0 0
  • 剛才看1988,韓寒的??吹剿劦剿呐瑢W(xué)們,就讓我突然想到了我的一個(gè)女同學(xué)。這個(gè)女同學(xué)很是高冷。170多,很高...
    Naleon閱讀 15,446評(píng)論 17 38
  • 感覺現(xiàn)在的自己配不上一個(gè)女孩的愛。 我自己有多不堪,只有我自己知道,說真的,我不會(huì)談戀愛,至少在我沒那么不堪之前,...
    公子不世閱讀 477評(píng)論 0 0

友情鏈接更多精彩內(nèi)容