【问题标题】:SKSpriteNode -- Texture not restored to original size after interrupting animateWithTexturesSKSpriteNode -- 中断 animateWithTextures 后纹理未恢复到原始大小
【发布时间】:2016-06-09 18:25:21
【问题描述】:

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

所以,假设我的纹理(比原始纹理稍大)在一个名为 textures 的数组中,这里有一个 sn-p 应该这样做:

{
    // ... 
    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...这是视觉结果:

动画前:

动画期间:

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

动画后:

(现在她看起来很胖)

我是不是用错了方法,或者这是一个错误,还是有办法修复它?

谢谢!

大卫

【问题讨论】:

    标签: swift animation sprite-kit skspritenode skaction


    【解决方案1】:

    我认为您在动画自然循环之前删除了它。

    尝试添加如下操作:

    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
    

    //REMOVE TIMER(或使用等待动作)

    【讨论】:

    • 感谢您的回答。关键是,我事先不知道动画什么时候可能会被中断——这是一个在执行animateWithTextures 动作时可能“随机”发生的事件,所以我不能这样安排时间。我希望实现的是,如果没有发生任何事情,动作就会完全执行,但是当精灵被打断时,它会恢复到它的原始状态(原始纹理+大小)。再一次,恢复了原始纹理,但没有恢复大小,这对我来说似乎是一个错误,或者我没有正确设置某些参数。
    • 很难理解你的错误,但你可以在运行时使用完成块强制它,并在动画完成后设置纹理和大小
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    相关资源
    最近更新 更多