iOS spriteKit 基础学习笔记(Swift语言)

一、创建sprite kit视图
导入SpriteKit模块,在一个源文件中加入:import SpriteKit。
选中并展开故事板中的一个view Controller,选中其View将class改为SKView。然后,在此View Controller的源文件中,在viewDidLoad方法内添加以下代码:
if let spriteView = self.view as? SKView{
spriteView.showsDrawCount = true
spriteView.showsFPS = true
spriteView.showsNodeCount = true
}
SKView默认情况下没有任何内容,需要开发者在上面放置所需显示的内容。上述代码中添加了一些调试信息:draw方法调用次数、显示屏幕每秒内所能绘制的帧数以及屏幕上的节点数。以上调试信息也只有在屏幕上有需要渲染的内容时才会同时显示,空白界面时不会显示。

二、创建场景
SKView之上需要显示一个场景,用来呈现游戏中所有的精灵。
创建一个继承SKScene的类,如GameScene。给GameScene添加一个如下属性:
var contentCreated = false
接着,在GameScene中加入下面方法:
override func didMove(view: SKView){
if self.contentCreated == false {
self.createSceneContents()
self.contentCreated = true
}
}
func createSceneContent() {
self.backgroundColor = SKColor.black
self.scaleMode = SKSceneScaleMode.aspectFit
}
然后,在View Controller类中实现viewWillAppear方法,并加入下面代码:
let scene = GameScene()
scene.size = self.view as ?SKView {
spriteView.presentScene(scene)
}
SKScene被添加到一个SKView上时,didMove:方法会被调用。我们可以在此方法准备它将呈现的内容。

三、游戏精灵
要显示游戏精灵,需要创建一个SKSpriteNode对象并设置其大小和位置,然后添加到SKScene中。
let sprite = SKSpriteNode(color: UIColor.black,size: CGSize(width: 64, height: 64))
sprite.position = CGPoint(x:100,y:100)
myScene.addChile(sprite)
文本精灵。如果想在sprite kit场景中显示文本,可通过SKLabelNode实现。
let textNode = SKLabelNode(fontNamed: "Zapfino")
textNode.text = "Hello world"
textNode.fontSize = 42
textNode.position = CGPoint(x: myScene.frame.midX, y:myScene.frame.midY)
textNode.name = "helloNode"
myScene.addChild(textNode)

四、字体
for fontFamilyName in UIFont.familyNames() as! [String] {
for fontName in UIFont.fontNamesForFamilyName(fontFamilyName) as! [String] {
print("Available font:(fontName)")
}
}
以上代码通过UIFont的familyNames方法来遍历获取所有有效字体。
另外,也可以使用自定义字体,以显示特殊文字效果,前提是需要提前添加字体文件。此处不表。

五、场景切换
SKView的presentScene:方法可以用来指定哪个场景将被显示,self.view?presentScene(newScene)。
如此可以立即切换到目标场景。另外也可以添加转换特效,只需创建一个SKTransition,然后调用presentScene(,transition:):
let crossFade = SKTransition.crossFade(withDuration: 1.0)
self.view?presentScene(newScene,transition:crossFade)

当一个SKScene被呈现时,将被替换的场景的willMoveFromView:方法会被立即调用,可在其中做一些清理工作,如移除其中的精灵以节省内存。然后,即将呈现的SKScene的didMove:方法则会被调用,可在此方法中准备场景中的内容。

六、精灵和标签的动作
可以通过SKAction对象让场景中的节点执行某个动作。所谓的动作包括让场景中的节点移动位置,改变颜色、透明度或大小。
如以下代码让节点在向右上角移动的同时进行淡出,然后执行某些代码,最后从场景中移除:
let moveUp = SKAction.move(by:CGVector(dx: 100, dy: 100),duration:1.0)
let fadeOut = SKAction.fadeOut(withDuration: 0.5)
let runBlock = SKAction.runBlock{ () -> Void in
print("Hello!")
}
let remove = SKAction.removeFromParent()
let moveAndFade = SKAction.group([moveUp, fadeOut])
let sequence = SKAction.sequence([moveAndFade,runBlock,remove])
node.runAction(sequence)
一个SKAction是一个对象,用于表示能够被节点执行的动作。通常,动作用于对节点属性进行某些修改,或者只是等待一段时间,或运行某段代码。
要执行某个动作,首先要创建一个SKAction对象(通过工厂方法)。然后调用相应节点的runAction:方法。
还可以将一个动作施加在多个节点上,让所有的节点都执行同样的动作:只需要创建一个SKAction,然后在每个SKNode上执行runAction:方法。
一个动作可以单独执行,也可与其他动作一起执行。即序列(sequence)和组合(group)。可混合。
当将某个动作和一个名字关联,就能够用actionForKey方法重新检索到这个动作:let theAction = node.actionForKey("My Action")
也可通过一个名字来删除动作
node.removeActionForKey("My Action")。
另外,也有removeAllActions方法一次性将所有动作从节点删除:
node.removeAllActions()。
一旦我们删除了一个动作,这个动作会被立即终止,无论它当前正在执行什么。但是,这个动作已经改变的状态依然被保留。

七、纹理贴图精灵
用位图来实现精灵。
let imageSprite = SKSpriteNode(imageNamed: "Spaceship")。
当使用上述SKSpriteNode(imageNamed:)方法创建一个精灵时,这个精灵的大小是图片的大小。创建完精灵之后,就可以像其他节点一样使用它:可设置其位置,将其添加到场景、令其执行动作等。
另外,可通过纹理图集,以节省内存提供渲染效率:创建一个Textures.altas的文件夹,把所有的纹理图片放到其中,然后拖动文件夹到项目中,设置build Settings中的“Sprite kit”项中“Enable Texture Altas Generation”值为YES。

八、形状节点
使用形状节点来绘制矢量图形,可以通过SKShapeNode实现。
let path = UIBezierPath(roundedRect: CGRect(x: -100, y: -100, width: 100, height: 100), cornerRadius: 20)
let shape = SKShapeNode(path: path.CGPath)
shape.strokeColor = SKColor.greenColor()
shape.fillColor = SKColor.redColor()
shape.glowWidth = 4
shape.position = CGPoint(x:myScene.freme.midX,y:myScene.frame.midY)
myScene.addChile(shape)

九、混合模式实现不同视觉效果
通过blendMode属性可以控制节点和场景其他部分的混合模式:
shape.blendMode = SKBlendMode.Add
当节点被绘制到场景中时,场景最终呈现的结果取决于节点的混合模式。在节点叠加进场景中时,Sprite Kit渲染引擎会获取节点每一个像素的颜色值以及像素下面点的颜色值,并根据指定的方式对这个颜色值进行计算并得到新的颜色值。
默认情况下,所有的SKNode都会使用SKBlendMode.Alpha作为默认的混合模式。这种模式会产生绝大部分情况下所需的效果,它是用位图的alpha通道乘以精灵的alpha属性,最终决定该节点有多少颜色被添加到场景中。还有其他混合模式包括:SKBlendMode.Add,SKBlendMode.Subtract,SKBlendMode.Multiply,SKBlendMode.MultiplyX2,SKBlendMode.Screen,SKBlendMode.Replace。

十、滤镜
联合运用CIFliter和SKEffectNode可以在节点上应用特殊的可视化效果:
let effect = SKEffectNode()
let filter = CIFilter(name: "CIGaussianBlur")
filter.setValue(20.0,forKey:"inputRadius")
effect.filter = filter
myScene.addChild(effect)
effect.addChild(imageSprite)
CIFilter能够在位图上应用滤镜效果。要在sprite kit上应用CIFilter需要创建一个SKEffectNode对象,然后将想使用滤镜的节点作为子节点加到这个SKEffectNode中。最后将这个SKEffectNode添加到场景中。然后,创建一个CIFilter,设置它的属性,将它赋给SKEffectNode的filter属性。创建CIFilter可以使用CIFilter类的filterWithName方法。这个方法需要一个字符串参数,以指定将要使用的滤镜名称。不同的滤镜使用不同的属性,配置这些属性使用CIFilter的setValue(_,forKey:)方法。

十一、烟雾、火焰和粒子特效
用粒子效果模拟各种相关特效。创建粒子效果的步骤:
1、File菜单选择Resource--Sprite Kit Particle File,选择所需模板;
2、打开上面所新建文件,此时将有一个粒子编辑器。在此编辑器中,可以编辑各种属性来定义粒子系统的最终效果,包括喷射的粒子数量、随时间进行的变化、颜色等。同时,还可以拖动查看粒子系统在移动时的动态显示效果。
配置好上诉粒子系统后,可用以下代码将效果添加到场景中:
let fireNode = SKEmitterNode(fileNamed: "***.sks")
myScene.addChild(fireNode)

十二、动画精灵
想用一系列位图构成一个Sprite Kit动画。首先制作所有分离的动画帧,然后将它们都放到Animation.atlas文件夹中,添加文件夹到项目。
后面就可通过SKAction的animateWithTextures(_, timePerFrame:)方法播放一个精灵集动画:
let atlas = SKTextureAtlas(named: "Animation")
let textNames = (atlas.textureNames as! [String]).sorted {
(first, second) -> Bool in
return first < second
}
var allTextures: [SKTexture] = textureNames.map { (textureName) -> SKTexture in
return altas.textureNamed(textureName)
}
let animatedSprite = SKSpriteNode(texture: allTextures[0])
animatedSprite.position = CGPoint(x: self.frame.midX, y:self.frame.midY)
self.addChild(animatedSprite)

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

推荐阅读更多精彩内容