我无法真正找到一个简单的解决方案,我看到的每个例子都只显示非常复杂的解决方案,但我想要的只是2-3个循环的图像,所以它看起来好像是动画的。与GIF动画效果相同。现在我有了这个来创建一个图像
MonsterNode = SKSpriteNode(imageNamed: "MonsterNode_GameScene")
但我如何将MonsterNode变量设置为此类动画?我真的在寻找实现这一目标所需的最少量代码。
答案 0 :(得分:4)
主要思想是使用animateWithTextures
执行此任务。您需要设置精灵需要动画的所有帧以及每帧的显示时间。然后使用repeatActionForever
运行动画循环。
// Add 3 frames
let f0 = SKTexture.init(imageNamed: "MonsterNode_GameScene_0")
let f1 = SKTexture.init(imageNamed: "MonsterNode_GameScene_1")
let f2 = SKTexture.init(imageNamed: "MonsterNode_GameScene_2")
let frames: [SKTexture] = [f0, f1, f2]
// Load the first frame as initialization
monsterNode = SKSpriteNode(imageNamed: "MonsterNode_GameScene_0")
monsterNode.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame))
// Change the frame per 0.2 sec
let animation = SKAction.animateWithTextures(frames, timePerFrame: 0.2)
monsterNode.runAction(SKAction.repeatActionForever(animation))
self.addChild(monsterNode)
答案 1 :(得分:0)
我得到了同样的大红X问题。 因此,而不是在代码中定义monsterNode。我通过拖动atlas文件夹中的第一个动画图像在sks屏幕上创建了monstor。然后为它指定一个名称:来自属性部分的monsterNode。这是代码
var runAnimation = [SKTexture]()
override func didMove(to view: SKView) {
let runAtlas = SKTextureAtlas(named: "run")
for index in 1...runAtlas.textureNames.count{
let textureName = String.init(format: "run%1d", index)
runAnimation.append(SKTexture(imageNamed: textureName))
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let monsterNode = self.childNode(withName: "monsterNode")
if(monsterNode != nil){
let animation = SKAction.animate(with: runAnimation, timePerFrame: 0.1)
monsterNode?.run(SKAction.repeatForever(animation))
}
}