一、什么是帧动画?
简单来说,帧动画就是当我们拥有一系列图像帧时,以一定的时间间隔将图像帧显示出来,从而达到动画效果。一般来说,动画的帧率都在24-60帧,也就是每秒24到六十个图像帧。
二、怎么用SpriteKit实现帧动画
1、准备好一个纹理图集的文件夹,并把它添加到工程文件。
2、创建一个精灵(spriteNode),这一步很简单。
3、创建一个SKTexture
数组,用来储存所有的图像帧。
4、buildAnimatio方法,用来构建动画:
(1)创建一个SKTextureAtlas
对象用来加载纹理图集和一个numImages对象用来存储纹理名称数量。
(2)写一个从1到numImages的for循环,遍历所有的帧,给每一个索引都构造一个名称,我这里命名为“frame”(注意这里的命名要和纹理图集里的每张图片的名字相同,否则就不能正常的加载纹理。
(3)从TextureAtlas中获取纹理并且将它添加到刚才创建的数组中,纹理不存在就添加一个空的SKTexture对象。
(4)将数组中的第一帧图像设置为精灵的初始纹理,设置好精灵的位置并把它添加到场景中。
5、animateSprite方法,用来播放动画:
(1)创建一个SKAction对象用来播放数组中的纹理,设置每帧的显示时间为0.1秒。
(2)创建一个无限重复的SKAction对象repeatAction,用来重复播放动画。
(3)将repeatAction应用到精灵上
完整代码如下:
import SpriteKit
class GameScene: SKScene {
private var spriteNode: SKSpriteNode!
private var walkingFrames: [SKTexture] = []
override func didMove(to view: SKView) {
buildAnimation()
animateSprite()
}
func buildAnimation() {
let textureAtlas = SKTextureAtlas(named: "waiting")
let numImages = textureAtlas.textureNames.count
print(numImages)
for i in 1...numImages {
let textureName = "frame\(i)"
walkingFrames.append(textureAtlas.textureNamed(textureName) ?? SKTexture())
}
spriteNode = SKSpriteNode(texture: walkingFrames[0])
spriteNode.position = CGPoint(x: frame.midX, y: frame.midY)
addChild(spriteNode)
}
func animateSprite() {
let animateAction = SKAction.animate(with: walkingFrames, timePerFrame: 0.1)
let repeatAction = SKAction.repeatForever(animateAction)
spriteNode.run(repeatAction)
}
}