2016-06-09 38 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在完成塊中強制它,並且在動畫完成後設置紋理和大小 –

相關問題