SpriteKit ist, zumindest für mich, eine der bemerkenswertesten Bibliotheken in Cocoa. Es macht das 2D-Feeling einfach und liefert mit wenig Aufwand oft sehr gute Ergebnisse. In diesem Beitrag werden wir die einzelnen Komponenten von SpriteKit aufschlüsseln und ihnen damit einen kurzen Einstieg bieten.
Was ist SpriteKit?
Das neben iOS 7 eingeführte SpriteKit bietet Entwicklern ein Framework für die grafische Darstellung und Animation in 2D für iOS und OS X. SpriteKit passt neben zwei anderen Animationsframeworks in iOS: Kern-Animation und Szenen-Kit. Während Core Animation für Spiele zu einfach ist und SceneKit für fortgeschrittenere Spiele in 3D eher gedacht ist, ist SpriteKit hingegen für 2D-Spiele sehr gut geeignet. SpriteKit rendert jeden Frame mit Inhalt und optimiert gleichzeitig das Rendering, die Animation und den Speicher im Frame. Es eiget sich für eine Vielzahl von 2D-Spielen mit Unterstützung für Sprites, Shapes, Textur, Text, Sound, Physiksimulation und Video. SpriteKit unterstützt auch Spezialeffekte für ihre Inhalte wie Zuschneiden und Bildbearbeitung.
Kurz gesagt, das SpriteKit bietet ein komplettes Rendering und eine Infrastruktur, die alle Low-Level-Prozesse innerhalb von OpenGL abdeckt und es Entwicklern ermöglicht, sich auf das Erstellen von großartigem Gameplay und Design zu konzentrieren.
Der SpriteKit Life-Cycle.
Wie viele Cacoa-Bibliotheken hat auch SpriteKit einen eingebauten Life Cycle und eine Verarbeitungschleife. In SpriteKit ermöglicht diese Schleife das Erstellen und Stapeln einzelner Frames wie Kacheln innerhalb eines Ansichtsfensters, das sich zwischen ihnen bewegt. Der Life Cycle läuft wie folgt ab:
Der Viewport.
Ein Fenster wird als Ansichtsfenster und Container für Szenen des Spiels erstellt. Jedes Fenster enthält normalerweise einen bestimmten Abschnitt des Spiels. Zum Beispiel können Sie das Spiel in einem Fenster haben, einen Score-Bildschirm in einem anderen und Käufe in einem dritten. Um ein typisches Spielefenster zu erstellen, erzeugt die Anwendung zunächst ein SKView-Objekt für das Spiel, das dann in einem Fenster platziert werden kann. Der SKView ist dann in der Lage, Szenen zu empfangen, um den Inhalt zu rendern und zu animieren. In vielerlei Hinsicht fungiert SKView als Szenenmanager, der Szenen durchlässt und die nächste Szene vorbereitet, während die aktuelle abgespielt wird.
Typischerweise verwendet ein Controller in dieser Phase die didMoveToView- und Update-Methoden, um Dinge wie gespeicherten Status, Score und andere globale Daten, die zwischen Szenen ausgetauscht werden, zuzuweisen und zu aktualisieren.
Eine Szene erzeugen.
Szenen werden als Frame innerhalb des Fensters erstellt. Diese Rahmen können entlang eines Gitters positioniert werden, um einen scrollbaren und beweglichen Hintergrund zu erzeugen, zwischen dem die Objekte wechseln. Diese einzelnen Szenen sind eine Sammlung von SKScene Objekten. Diese Szenen haben endliche Definitionen und Lebensdauer, wodurch die Objekterstellung im Speicher einfacher zu berechnen, zu animieren und zu verwalten ist. Während eine Szene sichtbar ist, werden alle Animationen und Logik kontinuierlich ausgeführt, bis die nächste Szene gerendert wird. Diese Kompartimentierung erlaubt es, komplexe Interaktionen und viele verschiedene Aspekte des Designs flexibel und reichlich vorhanden zu sein, während es für die Anwendung einfach bleibt, Ressourcen zuzuweisen und sie dann zu bereinigen, sobald die Szene fertig ist und die nächste beginnt.
SKScene stellt uns die didEvaluateActions und didSimulatePhysics Methoden zur Verfügung, um die Eigenschaften des Spiels entsprechend den Interaktionen innerhalb der Szene zu aktualisieren.
Nodes hinzufügen.
Innerhalb jeder Szene befindet sich eine Sammlung von verschiedenen Nodes. Nodes sind einfach Objekte, die als Baustein aller Inhalte dienen und gemeinsam bestimmen, wie Inhalte gekennzeichnet und gerendert werden. Die SKScene-Klasse ist eigentlich ein Nachkomme der SKNode-Klasse und dient als übergeordneter Node mit darin enthaltenen Child-Nodes. Ähnlich wie DOM-Nodes im Web haben SKNodes ähnliche Eigenschaften an ihre Kinder weiter, ähnlich wie DOM-Nodes im Web bestimmte CSS-Attribute vererbt haben. Die SKNode-Klasse selbst zeichnet nichts, sondern verwaltet die Eigenschaften und den Zustand der Child-Nodes. Dies ermöglicht es, das Rendering zu ändern, indem man einfach verschiedene Eigenschaften auf Nodes anwendet oder deren Reihenfolge oder Position ändert.
Als Beispiel für die Vererbung von Nodes sehen Sie sich die Abbildung des Smileys unten an. Das Gesicht wurde aus vier Nodes gebildet – einem gelben Kreis als Parent Node, mit zwei Augen und einem Mund als eigenem Node. Wenn der übergeordnete Node dann um 45 Grad gedreht wird, drehen sich auch die untergeordneten Nodes entsprechend. Wenn sich jedoch die Hintergrundfarbe des übergeordneten Nodes ändert, werden die untergeordneten Nodes nicht beeinflusst.
Eigenschaften, Attribute und Texturen von Nodes.
Wie bereits erwähnt, zeichnet die SKNode-Klasse selbst nichts. Nodes sind einfach Objekte mit manipulierbaren Eigenschaften. Dies mag zunächst etwas verwirrend sein, da diese Eigenschaften manipuliert werden können, um eine Grafik zu erstellen, aber es ist wichtig zu erkennen, dass ein Node standardmäßig weder Form noch Aussehen hat.
Um einem Node einen visuellen Zweck zu geben, werden oft Texturen verwendet. In vielen Szenarien wird eine Textur mit Hilfe von Image-Assets erstellt, um Sprites zu rendern. Auf diese Weise werden diese Bilder wiederverwendbar und einfach zu modifizieren, indem Sie einfach aktualisiert werden. Texturen können auch zur Laufzeit mit Core Graphics oder durch einfaches Ändern der Eigenschaften eines Nodes erstellt werden.