[SceneKit专题]跨平台游戏(macOS,tvOS,watchOS)

说明

本系列文章是对<3D Apple Games by Tutorials>一书的学习记录和体会此书对应的代码地址

SceneKit系列文章目录

更多iOS相关知识查看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

创建项目

打开Xcode创建新项目,选择macOS平台,选择Game类型,点击Next继续.

WX20171202-203043@2x.png

输入游戏名SceneKitGame,选择Swift语言,SceneKit游戏技术,取消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

转换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内容共享

可以在iOS和macOS之间共享原来的代码和资源.创建一个Shared分组

WX20171202-212027@2x.png

将下列文件和文件夹移动到Shared下面:

WX20171202-212430@2x.png

WX20171202-212449@2x.png

按住Shift键,选中GeometryFighter/ Shared/Particles下面的全部文件,打开右侧的属性检查器,勾选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

当然了,我们不需要每个文件都去添加,只需要将已创建好的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.

然后从示例代码中本章节的resources/GameViewController文件夹下拖放GameView.swiftGameViewController.swift到项目中,选中Copy items if neededGeometryFighterMac,点击Finish完成.

WX20171202-220527@2x.png

还要做的是恢复新的GameViewControllerMainMenu.xib之间的联系.

WX20171202-221725@2x.png

鼠标输入

选中MainMenu.xib,从右侧对象库中拖放一个Click Gesture RecognizerGame View中.

WX20171202-221925@2x.png

添加连接函数:


WX20171202-222021@2x.png

现在还差最后一步,添加AppIcon,你可以从本章节的resources/AppIcon/文件夹中找到,拖放到Assets.xcassets中的AppIcon下:

WX20171202-222317@2x.png

运行一下程序:


WX20171202-222411@2x.png

本项目的最终完成版代码可以在对应章节的projects/ final/GeometryFighter/下找到.

17-tvOS游戏Breaker

创建项目

创建项目


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中,就可以调出遥控器了:

WX20171203-095059@2x.png

移植到tvOS

在代码中找到本章节的projects/ starter/Breaker/文件夹接着处理.

和前面类似,选中Breaker,添加新的target,在弹出窗中选择tvOSGame.

WX20171203-095620@2x.png

WX20171203-095637@2x.png

WX20171203-095650@2x.png

WX20171203-095741@2x.png

targets间内容共享

添加一个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
图标

图标资源在本章节对应的resources文件夹下.

打开BreakerTV/Assets.xcassets,选中App Icon & Top Shelf Image,将图片拖放进去:

WX20171203-110510@2x.png

运行一下,看到图标出现在Apple TV首页上了:


WX20171203-110525@2x.png

点击进入游戏,开始玩吧:


WX20171203-111349@2x.png

18-watchOS游戏Geometry Fighter

在Xcode中,并没有专门的watchOS版游戏的模板,我们需要做的是创建一个iOS的游戏,再给它添加watchOS的支持.

添加watchOS支持

我们直接在原iOS项目基础上添加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间内容共享

创建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

现在需要添加新的InterfaceController.swift.在本章节对应代码的resources/source文件夹下,拖放到Xcode中.

WX20171203-115029@2x.png

然后建立连接:


WX20171203-115144@2x.png
添加触摸输入

选中Interface.storyboard,拖放一个Tap Gesture Recognizer过来.

WX20171203-115320@2x.png

建立手势的连接:


WX20171203-115417@2x.png

现在已经基本完成了.

图标

所需图片资源在本章节对应的resource/AppIcon文件夹下.

选中Assets.xcassets下面的AppIcon,将图片拖放到其中:

WX20171203-115723@2x.png

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


WX20171203-115751@2x.png

项目的最终完成版本章节对应的projects/ final/GeometryFighter/文件夹下.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 说明 本系列文章是对<3D Apple Games by Tutorials>一书的学习记录和体会此书对应的代码地...
    苹果API搬运工阅读 635评论 0 1
  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 25,263评论 7 249
  • 简书这一APP今天刚听说,是一位专栏作家推荐的,本想下载看看有什么好玩儿的,打开却发现这是阅读与写作爱好者的...
    慕莫阅读 245评论 0 0
  • 刚才看1988,韩寒的。看到他谈到他的女同学们,就让我突然想到了我的一个女同学。这个女同学很是高冷。170多,很高...
    Naleon阅读 15,344评论 17 38
  • 感觉现在的自己配不上一个女孩的爱。 我自己有多不堪,只有我自己知道,说真的,我不会谈恋爱,至少在我没那么不堪之前,...
    公子不世阅读 336评论 0 0