2015-04-15 41 views
2

我的SceneKit項目中有一個動畫。它動畫按下的節點。現在,動漫作品與此代碼:SCNTransaction AnimationOptions

SCNTransaction.begin() 
SCNTransaction.setAnimationDuration(0.5) 
    SCNTransaction.setCompletionBlock { 
     SCNTransaction.begin() 
     SCNTransaction.setAnimationDuration(0.5) 
     result.node!.position.y -= 1 
     SCNTransaction.commit() 
    } 
    result.node!.position.y += 1 
    SCNTransaction.commit() 
} 

我想使節點看起來就像是跳躍的,所以我想用一些動畫的選項,比如你可以用一個UIView使用:CurveEaseIn等。 (我希望它開始緩慢,突然結束,第二個應該先突然,然後緩慢)

有沒有辦法將這些用於SCNTransaction?或者是否有更好的方法來使其「反彈」?

感謝提前:)

回答

2

改變定時功能

是的,你可以用SCNTransaction改變定時功能。

您可以通過創建一個CAMediaTimingFunction對象並使用setAnimationTimingFunction()進行分配來完成此操作。有幾個命名的定時功能(例如「易於使用」),或者您可以使用兩組控制點創建一個。

let easeIn = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) 
SCNTransaction.setAnimationTimingFunction(easeIn) 

使用關鍵幀動畫

另一種方法是創建用於該節點的y位置上定製關鍵幀動畫。我做了一個反彈的the sample code for Chapter 5my book about Scene Kit尋找關鍵幀動畫:

var jump = CAKeyframeAnimation(keyPath: "position.y") 

let easeIn = CAMediaTimingFunction(controlPoints: 0.35, 0.0, 1.0, 1.0) 
let easeOut = CAMediaTimingFunction(controlPoints: 0.0, 1.0, 0.65, 1.0) 

jump.values = [0.000000, 0.433333, 0.000000, 0.124444, 0.000000, 0.035111, 0.000000]; 
jump.keyTimes = [0.000000, 0.255319, 0.531915, 0.680851, 0.829788, 0.914894, 1.000000]; 
jump.timingFunctions = [easeOut, easeIn, easeOut, easeIn, easeOut, easeIn ]; 
jump.duration = 0.783333; 

yourNodeThatWasClicked.addAnimation(jump, forKey: "jump and bounce") 

如果你走這條路,我會建議找的地方,你可以實驗,調整,並與的關鍵時期和價值發揮關鍵幀動畫。也許是一個操場或一個帶有滑塊的小型自定義應用程序,您可以在其中獲得快速迭代。

+0

該死的,這太美了!主席先生,你應該得到一塊餅乾!非常感謝:D – LinusGeffarth

+0

我想我想與你分享一個改進:不是將值設置爲* 0.0001 *等等,你可能想要做'result.node.position.y + 0.0001',因爲這會使它從現在的節點位置彈開,而不是從y = 0開始。 :) – LinusGeffarth

+0

@LinusG。您也可以將動畫配置爲「疊加」。 –

1

您可以使用CABasicAnimationbyValue1並將autoreverses設置爲YES。最後將其timingFunction設置爲kCAMediaTimingFunctionEaseIn(或更具體地說,使用該曲線名稱初始化的定時功能)。

+0

謝謝你的回答,我和其他人一起去了。以我的讚賞爲感謝;) – LinusGeffarth

+0

SpriteKit中是否有類似於SCNTransaction的東西? – Confused