(Tak, wiem, że to pytanie jest o SceneKit, nie SpriteKit, ale dotyka podobieństw i różnic między obu ram, więc zwracam ci w tej odpowiedzi.)
W SpriteKit , metody pętli gier (update
, didSimulatePhysics
, itp.) były pierwotnie częścią klasy scen SKScene
. Nie zawsze jest to najlepszy pomysł - możesz potraktować instancję sceny bardziej jak dane niż miejsce do implementacji logiki gry (szczególnie teraz, że sceny mogą być całkowicie zbudowane w graficznym edytorze sceny Xcode 6). Tak więc w iOS 8 i OS X Yosemite metody te występują w dwóch miejscach. Jeśli już tworzysz podklasę SKScene
dla logiki gry per-frame, możesz to kontynuować. Ale jeśli wolisz umieścić ten kod w innym miejscu, możesz ustawić delegata na swojej scenie i wdrożyć tam odpowiednie metody SKSceneDelegate
.
SceneKit ma więcej oddzielenia obaw. Obiekt SCNScene
jest znacznie bliższy obiektowi czystego modelu danych, a wszystkie funkcje pętli renderowania są zarządzane przez widok (lub inny obiekt) odpowiedzialny za wyświetlanie sceny. Zazwyczaj wyświetla się scenę w postaci SCNView
- ale są też inne klasy, które mogą renderować sceny, więc ich popularny interfejs API znajduje się w protokole SCNSceneRenderer
. Użyj właściwości delegate
zdefiniowanej przez ten protokół, aby ustawić delegata dla widoku, a w swoim uczestniku możesz wdrożyć metody SCNSceneRendererDelegate
, aby uczestniczyć w kluczowych fazach pętli renderowania.
W SceneKit fazy pętli odpowiadają prawie bezpośrednio do tych w SpriteKit: update:
staje renderer:updateAtTime:
, didEvaluateActions:
staje renderer:didApplyAnimationsAtTime:
(ponieważ zawiera animacje CoreAnimation stylu, jak również działania SpriteKit-Style), itd
Tak , za równowartość SceneKit z update
metody SpriteKit jednej klatce, to zrobić:
ustawić jeden z niestandardowych obiektów (powiedzmy, widok kontroler) jako delegate
instancji SCNView
.
W tej niestandardowej klasy, wdrożyć następujące metody:
func renderer(_ aRenderer: SCNSceneRenderer!, updateAtTime time: NSTimeInterval) {
// per-frame code here
}
Czy podobna do innych SCNSceneRendererDelegate
metod jeśli logika na klatce musi się zdarzyć po działania lub fizyka zostały przetworzone.
Próbowałem tego ... i nie jest jeszcze dobrze. Jak myślisz, co to za problem? Jestem całkiem zdezorientowany. przesłanianie func renderujący (_ aRenderer: SCNSceneRenderer !, czas updateAtTime: NSTimeInterval) { println ("Hello \ n") } –
To nie jest metoda override na danym podklasy - patrz edytowany odpowiedź. – rickster
Zastanawiam się, dlaczego używają tu czasu systemowego?Czy to nie zepsuje rzeczy, jeśli zegar się zmieni? –