2014-06-27 11 views
6

Grałem z zestawem sprite i użyłem metody aktualizacji, aby ustawić rzeczy do przetworzenia za każdym razem. Próbuję nauczyć się szybkiego zestawu scen i nie mogę znaleźć odpowiednika.Metoda aktualizacji SceneKit dla symulacji fizyki

Czy możesz wskazać mi przykład zastosowania metody aktualizacji dla programu SceneKit? Dzięki.

Odpowiedz

12

(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ć:

  1. ustawić jeden z niestandardowych obiektów (powiedzmy, widok kontroler) jako delegate instancji SCNView.

  2. 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.

+0

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") } –

+2

To nie jest metoda override na danym podklasy - patrz edytowany odpowiedź. – rickster

+0

Zastanawiam się, dlaczego używają tu czasu systemowego?Czy to nie zepsuje rzeczy, jeśli zegar się zmieni? –