2016-06-09 25 views
0

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

因此,假设我有我的纹理称为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

(现在她只是看起来胖)

我是不是该用错误的方式,或者这是一个错误,或者是有办法解决这个问题?

谢谢!

大卫

回答

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 

//移除TIMER(或使用行动等待)

+0

感谢您的回答。关键是,我不知道什么时候动画可能被中断 - 这是一个事件,可能在“animateWithTextures”动作执行时“随机”发生,所以我不能像这样计时。我希望能够实现的是,如果没有任何事情发生,动作就会完全执行,但当它被打断时,精灵会恢复到原始状态(原始纹理+大小)。同样,原始纹理被恢复的事实,但不是尺寸,对我来说看起来像一个bug,或者有一些参数我没有正确设置。 – David

+0

很难理解你的bug,但是你可以用run completion在完成块中强制它,并且在动画完成后设置纹理和大小 –