2016-05-28 4 views
1

Ich arbeite an einem SceneKit-Spiel mit Swift, und ich denke über die beste Möglichkeit, die verschiedenen Bildschirme/Zustände um die eigentliche Hauptspielszene zu organisieren. Ich habe einen einfachen Prototyp, die aus drei Staaten bestehen:Architektur eines SceneKit-Spiels, mehrere View-Controller für Menübildschirme?

  • Splash Screen (Spielart wählen) ->
  • Spiel ->
  • Spiel über Bildschirm (wählen, wieder zu spielen oder Rückkehr zu spritzen)

In dem Prototyp entschied ich mich für UIKit, um die UI-Elemente zu tun, anstatt eine SpriteKit Overlay. Obwohl es im Moment nur Schaltflächen sind, was in SpriteKit leicht genug wäre, möchte ich in Zukunft vielleicht Schieberegler hinzufügen (zB einen Optionen-Bildschirm, um die Steuerempfindlichkeit einzustellen), Texteingabe usw., und dann wirst du große Brocken neu erstellen von Uikit.

So hat derzeit jede der 3 oben beschriebenen Szenen ihre eigene UIViewController. Die Splash und Game ViewControllers haben ihre eigenen s und SCNScene s, und der GameOver ist ein Modal, das über die Hauptspielszene anzeigt.

Diese Struktur ist nicht wirklich ideal, da es bedeutet, dass das Hauptspiel SCNScene immer dann neu geladen wird, wenn die viewDidLoad der GameViewController feuert. Die Haupt-SCNScene ist ziemlich detailliert, dauert also ein paar Sekunden zu laden, und mit wiederholten Zyklen scheint dies Speicherprobleme zu schaffen. Nach 2 Zyklen Splash -> Spiel -> GameOver bekomme ich eine Speicherwarnung, und nach dem dritten Zyklus verliert Xcode die Verbindung zum iPhone (was meiner Erfahrung nach durch Speicherprobleme verursacht zu sein scheint).

Ich hätte gerne eine Haupt GameViewController, die die am häufigsten wiederverwendeten Assets einmal lädt, aber immer noch in der Lage sein, zwischen den verschiedenen Menübildschirmen zu wechseln.

Was sind die Optionen hier?

Ich dachte, vielleicht könnte ich eine Haupt GameViewController haben, die das Laden und Entladen von SceneKit-Assets steuert und die einzige SCNView hat. Ihre Methode viewDidLoad würde nur einmal ausgelöst, wenn die App zum ersten Mal gestartet wird. Dann würde jede der anderen Ansichten eine sehr minimale UIViewController haben, die als Modals über den Haupt-GameViewController mit "OverCurrentContext" ausgewählt würde.

Ich wollte fragen, ob dieses Muster machbar klingt und wie andere ihre SceneKit-Spiele organisieren. Ich bin noch immer ziemlich neu in der Entwicklung von iOS, daher könnte es sein, dass mir ein grundlegendes Spieldesign fehlt.

Antwort

1

Meine Erfahrung mit der Verwendung von nur einem GameViewController (meine aktuelle Arbeit für MAC OS X: Ich begann ein 'kleines' 3D-Spiel mit einem MainMenu/Startbildschirm, einem Hud und 2 oder 3 komplett verschiedenen 3D-Szenen - das soll (ported dann auch zu IOS):

In der letzten Woche habe ich versucht, was Sie gefragt, um nur einen GameViewController für "alle" das Zeug zu verwenden - für mich schien es der einfache und "gute" Weg zu sein mach es - aber auch nach vielen stunden mit all meinen tricks habe ich die letzten jahre gelernt das ich nicht laden konnte eine andere (oder wechselnde) 3D szene (oder gar keine andere sprite kit scene hud) nach laden einer szenekit-scene laden in einem einzigen ViewController. Vielleicht gibt es einen Unterschied zwischen MAC OS X und IOS, aber ich habe es sogar in einer iOS-Version versucht und es hat das gleiche Verhalten.

Was ich tun konnte: Sie können eine geladene 3D-Szene ändern oder Daten im Sprite-Kit-Hud usw. ändern, so dass Sie eine 3D-Szene verwenden können, um die Dinge hinzuzufügen oder zu zeigen, wenn sie benötigt werden Soweit meine Tests hier gezeigt haben, benötigen Sie einen ViewController, um eine komplett neue 3D-Szene oder 2D/3D-Menüs etc. zu zeigen. Ich werde meine weiteren Erfahrungen posten, sobald ich einen Schritt weiter bin. Ich hoffe, das hilft ein wenig.

+0

Vielen Dank für das versuchen. Interessant ist, dass Sie keine neue Szene in eine Ansicht laden konnten. Haben Sie [presentScene: withTransition] versucht (https://developer.apple.com/library/mac/documentation/SceneKit/Reference/SCNSceneRenderer_Protocol/index.html#//apple_ref/occ/intfm/SCNSceneRenderer/presentScene:withTransition:incomingPointOfView : FertigstellungHandler :)? "Verwenden Sie diese Methode, um die in einer SceneKit-Ansicht (oder einem anderen Renderer) angezeigte Szene mit einem animierten Übergang zu ändern." – OliverD

Verwandte Themen