SKSpriteNode - 在中断animateWithTextures

时间:2016-06-09 18:25:21

标签: swift animation sprite-kit skspritenode skaction

我正在使用SKAction.animateWithTextures为Swift中的SKSpriteNode设置动画,参数restore设置为true。如a different thread中所述,出现了第一个问题,因为纹理图集中的图像略大于原始节点。现在出现了另一个问题:如果我使用SKSpriteNode.removeAllActions()中断动画,那么节点将恢复到原始纹理,但节点的大小不会恢复到原始状态,导致图像失真,因为纹理在地图集更大。

所以,假设我的纹理(略大于原始纹理)在一个名为textures的数组中,这里有一个应该执行此操作的片段:

{
    // ... 
    sprite.runAction(SKAction.animateWithTextures(textures, timePerFrame: 1, resize: true, restore: true))
    NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: #selector(test), userInfo: nil, repeats: false)
    // ...
}
func test() {
    sprite.removeAllActions()
}

注意:此示例使用计时器仅模拟动画的随机中断。在游戏世界中,动画可能在某个未知时间完成或中断(通常在与另一个精灵发生接触时)。

执行此操作后,精灵将恢复到其原始纹理,但会拉伸以匹配图集中纹理的大小。我已经检查了xScale属性,但当然是1.0 ...这是视觉效果:

动画之前:

Before animation

动画期间:

During animation

(注意图像如何从原始位置移开,因为SK保持居中:-()

动画后:

After animation has been cancelled

(现在她看起来很胖)

我是以错误的方式使用它,还是这是一个错误,还是有办法解决它?

谢谢!

大卫

1 个答案:

答案 0 :(得分:0)

我认为你是在动画自然循环之前移除它。

尝试添加以下操作:

let actionTexture = SKAction.animateWithTextures(textures, timePerFrame: 0.1, resize: true, restore: true)
sprite.runAction(actionTexture, count:30) // 30 x 0.1 = 3 sec tot animation

//删除计时器(或等待时使用动作)