标签:root uiview 渲染 sprite scene
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
。
标签:root uiview 渲染 sprite scene
原文地址:http://blog.csdn.net/colouful987/article/details/44016809