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))

你可能感兴趣的:(iOS spriteKit 基础学习笔记(Swift语言))