07.SpriteKit征程——创建第一个场景
Sprite Kit
的内容被放置于窗口当中,即那些可视内容。Sprite Kit
之中的内容由SKView
类进行渲染(注:一般将普通的UIView
转换成SKView
是这么写的let skView = self.view as SKView
)。由SKView
对象渲染的内容称之为场景,也就是Scene
,它隶属于SKScene
类.场景作为一个root node
又继承于UIResponder
类,因此它能够响应用户的输入,当然还有其他丰富的内容使得非常好的适用于游戏。
由于在Sprite Kit
之中的内容是由View
对象进行渲染呈现的,因此你可以将该View
和其他Views
相关联(注:在视图层级上)。
举例,什么叫
combine this view with other views in the view hierarchy
:首先我们创建一个
UIButton
,它是一个标准的UIControl
,是不是有点蒙?但是下面我要告诉你,UIControl
类是继承于UIView
!所以说按钮也是一个视图对吧(这里是给初学者进行简单知识补充)。现在将按钮放置到你的Sprite Kit
视图之上,两个视图(一个是button
,一个就是主View
)有一个层级关系(比如视图包含了按钮,假如有个Label
也放置到了视图上,那么标签和按钮就是同级关系,偶的粗浅理解)。
当然之上的例子,我们也可以通过增加交互精灵sprites
实现我们自己的按钮,这完全取决于你。下面的例子我们来看看如何实现场景中的交互。
注:
统一下术语,为保持原汁原味,还是尽量用英文。
视图控制器:
View Controller
视图:
UIView
场景:
SKView
继承于UIView
写在前面
本文你可以创建一个Single View Application
,如此,工程自动会给我们创建一个ViewController.swift
、AppDelegate.swift
和Main.storyboard
文件。你大可以删掉ViewController.swift
和Main.storyboard
中的那个View Controller Scene
,别问我具体删哪个,你要知道在SB里只有孤零零那一个,不删它删谁,之后呢就是按照接下来的干了。当然你也可以选择保留,因为我们可以修改已有的文件进行配置 也是一样的! 这只取决于你!!!
创建一个视图控制器
- 打开SB,Storyboard,拖一个
ViewController
进去,默认这个视图控制器包含了一个View,选中它,你会发现该视图默认继承于UIView
,现在将其改为SKView
。记住在Sprite Kit
中的视图用SKView
的,而非UIView
。 - 添加
Cocoa Touch Class
,而非Mac OSX
的!增加一个GameViewController
类,继承于UIViewController
类,然后你得添加Sprite Kit
的头文件!import SpriteKit
- 实现视图控制器中的
ViewDidLoad
,来配置视图:override func viewDidLoad() { super.viewDidLoad() //将视图控制器包含的view转换成SKView 角色转换嘛 let spriteView = self.view as SKView spriteView.showsDrawCount = true //显示绘制次数 spriteView.showsNodeCount = true //显示当前节点数 越少越好 spriteView.showsFPS = true //显示帧数 //还有代码需要添加到这里!! }
自定义一个场景
- 创建一个新类命名为
HelloScene
,并且继承于SKScene
类class HelloScene:SKScene{ //其他存在的内容 待会可能要修改 }
- 修改前面视图控制器中的代码,使得创建一个场景呈现到我们的视图
View
中。override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) //创建一个hello实例 let hello = HelloScene(size:CGSizeMake(768,1024)) /* 还记得viewDidLoad我们也创建了一样的代码 这里不对吧?我的理解,self.view 是已经存在的 隶属于我们创建的视图控制器中的视图,现在我们创建 了两个实例来指向同一个self.view。尽管它们名字是一样 但是隶属的函数不同,自然也就不同喽。 */ let spriteView = self.view as SKView //呈现 skView.presentScene(hello) }
- Build and run!!! 但让这个app只会呈现一个空白视图….不过会显示帧数,绘制次数等信息。
添加内容到场景中
我们设计一款基于Sprite Kit
的游戏时,将游戏内容划分为多个自定义场景(当然它们都是继承于SKScene
类)进行呈现。就在刚刚我们创建了第一个HelloScene
场景来显示"Hello World"
文本,非常简单的一个小东西。类似于ViewController
加载各自视图(View
),通常做法是先配置好内容属性再呈现(比如子视图大小、放置位置、颜色等等),这很重要!引申到我们的SKScene
,采用didMoveToView: 方法,任何时候场景将要被呈现到视图中时就会被调用!
- 往
HelloScene
添加一个标志位来追踪场景内容是否是第一次被创建,原因前面讲到了,任何时候场景被呈现到视图时就咬调用didMoveToView method
。我可不想重复创建!//添加一个标志位到HelloScene类中,放到最上面。 private var contentCreated:Bool = false
- 实现
didMoveToView
方法override func didMoveToView(view: SKView) { //判断是否是第一次创建 if(!self.contentCreated){ //置位 以后就不会在执行这里的代码拉 self.contentCreated = true //创建一个节点 但是是label的节点! 字体是Chalkduster var helloNode = SKLabelNode(fontNamed: "Chalkduster") helloNode.text = "Hello Wolrd" helloNode.fontSize = 42 //位置是放在屏幕中间 helloNode.position = CGPoitMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)) self.backgroundColor = SKColor.blueColor() self.scaleMode = .AspectFit //添加进去 self.addChild(helloNode) } }
- Build and Run !!!!Nice Job
nice job! 尽管如此我发现只是显示一点东西似乎有些枯燥 因此下章将加入一些Action
。