In dieser Serie lernen wir, wie Sie mit SpriteKit 2D-Spiele für iOS erstellen. In diesem Beitrag werden wir die Erforschung der SpriteKit-Knoten fortsetzen und etwas über eine spezielle Art von Knoten namens "Sprite" -an erfahren SKSpriteNode
.
Um diesem Tutorial zu folgen, laden Sie einfach das begleitende GitHub-Repo herunter. Es hat einen Ordner namens ExampleProject Starter. Öffnen Sie das Projekt in diesem Ordner in Xcode, und Sie können loslegen!
Ein SKSpriteNode
wird entweder als Rechteck mit einer zugeordneten Textur oder als farbiges untexturiertes Rechteck gezeichnet. Ein ... Erstellen SKSpriteNode
Am häufigsten wird eine Textur abgebildet, da Sie damit das Artwork Ihres Spiels zum Leben erwecken.
Fügen Sie Folgendes dem hinzu didMove (bis :)
Methode innerhalb GameScene.swift.
func didMove überschreiben (zur Ansicht: SKView) let startGameLabel = SKLabelNode (Text: "Start Game") startGameLabel.name = "startgame" startGameLabel.position = CGPoint (x: size.width / 2, y: size.height / 2 ) addChild (startGameLabel) let redSprite = SKSpriteNode (Farbe: .red, Größe: CGSize (Breite: 200, Höhe: 200)) addChild (redSprite)
Hier verwenden wir den Komfort Intiailizer init (Farbe: Größe :)
Dadurch wird ein rechteckiges Sprite mit der Farbe und Größe gezeichnet, die Sie als Parameter übergeben. Wenn Sie das Projekt jetzt testen, wird die Hälfte des roten Quadrats angezeigt.
Sie fragen sich vielleicht, warum nur die Hälfte des Sprites angezeigt wird, da wir dies bereits festgestellt haben SKNode
Die Ursprünge liegen bei (0,0). Dies weil die SKSpriteNode
's Rahmen und daher ist seine Textur auf seine Position zentriert. Um dieses Verhalten zu ändern, können Sie die Sprites ändern Ankerpunkt
Diese Eigenschaft bestimmt den Punkt, an dem der Rahmen positioniert wird. Das folgende Diagramm zeigt, wie die Ankerpunkt
funktioniert.
Das Ankerpunkt
wird im Koordinatensystem der Einheit angegeben, an welcher Stelle (0,0) links unten und (1,1) in der rechten oberen Ecke des Rahmens. Die Standardeinstellung für SKSpriteNode
s ist (0,5,0,5).
Mach weiter und ändere das Ankerpunkt
Eigentum an (0,0) und bemerke den Unterschied.
func didMove überschreiben (zur Ansicht: SKView) let startGameLabel = SKLabelNode (Text: "Start Game") startGameLabel.name = "startgame" startGameLabel.position = CGPoint (x: size.width / 2, y: size.height / 2 ) addChild (startGameLabel) let redSprite = SKSpriteNode (Farbe: .red, Größe: CGSize (Breite: 200, Höhe: 200)) redSprite.anchorPoint = CGPoint (x: 0, y: 0) addChild (redSprite)
Wenn Sie jetzt testen, werden Sie sehen, dass das Sprite perfekt an der linken unteren Ecke der Szene ausgerichtet ist.
Verschieben Sie es jetzt in die obere Mitte der Szene, indem Sie seine Positionseigenschaft ändern. Ersetzen Sie Ihre didMove (bis :)
Funktion mit den folgenden:
func didMove überschreiben (zur Ansicht: SKView) let startGameLabel = SKLabelNode (Text: "Start Game") startGameLabel.name = "startgame" startGameLabel.position = CGPoint (x: size.width / 2, y: size.height / 2 ) addChild (startGameLabel) let redSprite = SKSpriteNode (Farbe: .red, Größe: CGSize (Breite: 200, Höhe: 200)) redSprite.anchorPoint = CGPoint (x: 0, y: 0) size.width / 2 - 100, y: size.height - 210) addChild (redSprite)
Beachten Sie, wie wir das von beiden subtrahieren mussten x
und y
Werte, um das Sprite zu zentrieren. Wenn wir die verlassen hätten Ankerpunkt
In der Standardeinstellung wäre es dann bereits auf das zentriert x
Achse. Es ist wichtig zu wissen, dass Sie beim Ändern des Ankerpunkts möglicherweise einige Anpassungen an Ihrer Positionierung vornehmen müssen.
Diese rote Box eignet sich gut zum Üben mit dem Positionieren, aber Sie möchten Ihr Sprite normalerweise mit Artwork für Ihr Spiel strukturieren.
Lassen Sie uns eine Textur erstellen SKSpriteNode
. Fügen Sie den folgenden Code am unteren Rand des hinzu didMove (bis :)
Methode.
func didMove überschreiben (zur Ansicht: SKView) … let player = SKSpriteNode (imageNamed: "player") player.position = CGPoint (x: size.width / 2, y: 300) addChild (player)
Hier verwenden wir den Komfort-Initialisierer init (imageNamed :)
, die als Parameter den Namen eines Bildes ohne die Erweiterung übernimmt. Dies ist der einfachste Weg, um ein texturiertes Sprite zu erstellen, da es die Textur für Sie aus dem Bild erstellt, das Sie übergeben.
Die andere Möglichkeit, eine Textur zu erstellen SKSpriteNode
ist ein zu schaffen SKTexture
vorher und verwenden Sie einen der Intializer, die eine Textur als Parameter verwenden.
Lassen Sie uns noch ein paar mehr schaffen SKSpriteNode
s und ändern Sie einige ihrer Eigenschaften. Fügen Sie diese wieder unten hinzu didMove (bis :)
Funktion.
func didMove überschreiben (zur Ansicht: SKView) … let enem1 = SKSpriteNode (imageName: "enemy1") enemy1.position = CGPoint (x: 100, y: 300) enemy1.xScale = 2 addChild (enemy1) let enemy2 = SKSpriteNode ( imageNamed: "enemy2") enemy2.position = CGPoint (x: size.width - 100, y: 300) enemy2.zRotation = 3.14 * 90/180 addChild (enemy2)
Hier schaffen wir zwei SKSpriteNode
s, Feind1
und Feind2
. Wir setzen die xScale
auf Feind1
zu 2 und ändern Sie die zRotation
auf Feind2
um es zu drehen 90 grad. (Das zRotation
Die Eigenschaft nimmt die Werte im Bogenmaß an, und ein positiver Wert zeigt eine Drehung gegen den Uhrzeigersinn an.)
Wir haben mit dem Ändern einiger Eigenschaften eines Sprites experimentiert. Schauen Sie sich die Dokumentation zu SKNodes und SKSpriteNodes an und ändern Sie einige der anderen Eigenschaften, um die Auswirkungen zu sehen.
Sprite-Knoten eignen sich für grundlegende Rechtecke und Texturen, manchmal wird jedoch eine komplexere Form benötigt. Das SKShapeNode
hast du in diesen fällen gedeckt. Als nächstes werden wir uns die Formknoten ansehen.
Ein weiterer nützlicher Knoten ist der SKShapeNode
. Dieser Knoten stellt eine durch einen Core Graphics-Pfad definierte Form dar. SKShapeNode
s sind nützlich für Inhalte, die mit einem nicht leicht zu realisieren sind SKSpriteNode
. Diese Klasse ist speicherintensiver und hat eine geringere Leistung als die Verwendung von SKSpriteNode
, Sie sollten es daher sparsam einsetzen.
So weisen Sie eine Form zu SKShapeNode
, du kannst ein einstellen CGPath
zu den Knoten Pfad
Eigentum. Es gibt jedoch einige Initialisierer, die vordefinierte Formen wie Rechtecke, Kreise und Ellipsen bieten. Erstellen Sie einen Kreis mit dem Komfort-Initialisierer init (circleOfRadius :)
.
Fügen Sie dann am unteren Rand Folgendes hinzu didMove (bis :)
Methode.
func didMove überschreiben (zur Ansicht: SKView) … let circle = SKShapeNode (circleOfRadius: 50) circle.strokeColor = SKColor.green circle.fillColor = SKColor.blue circle.lineWidth = 8 circle.position = CGPoint (x: size.width / 2, y: 400) addChild (circle)
Wir ändern einige Eigenschaften des Formknotens, positionieren ihn und fügen ihn der Szene hinzu. Es ist sehr einfach, die vordefinierten Forminitialisierer zu verwenden. Erstellen Sie jedoch einen Komplex CGPath
manuell dauert viel Zeit und ist nicht für schwache Nerven gedacht, da es in der Regel komplexe Berechnungen erfordert.
Glücklicherweise gibt es ein Werkzeug, mit dem Sie Formen visuell zeichnen und ihre Formen exportieren können CGPath
als Swift-Code. Schauen Sie sich PaintCode an, wenn Sie mehr erfahren möchten.
Sprite-Nodes und Shape-Nodes decken die meisten Fälle ab. Manchmal möchten Sie jedoch, dass Videos in Ihren Apps angezeigt werden. Das SKVideoNode
, was wir uns als nächstes ansehen, hast du gedeckt.
Der letzte Knoten, den wir uns ansehen, ist der SKVideoNode
. Wie der Name schon sagt, können Sie mit diesem Knoten Videos in Ihren Spielen abspielen.
Es gibt verschiedene Möglichkeiten, eine SKVideoNode
. Man benutzt eine Instanz von AVPlayer
, ein anderer verwendet nur den Namen einer Videodatei, die im App-Bundle gespeichert ist. Die dritte Möglichkeit ist die Verwendung von URL
.
Eine Sache, die zu beachten ist, ist das Video Größe
Die Eigenschaft ist anfangs gleich der Größe des Zielvideos. Sie können das ändern Größe
Eigenschaft, und das Video wird auf die neue Größe gestreckt.
Eine andere Sache, die man beachten sollte, ist die SKVideoNode
bietet an abspielen()
und Pause()
nur Methoden. Wenn Sie mehr Kontrolle über Ihre Videos haben möchten, initialisieren Sie eine SKVideoNode
mit einem bestehenden AVPlayer
und verwenden Sie diese zur Steuerung Ihrer Videos.
Lass uns die einfachste Methode verwenden, um eine SKVideoNode
. Fügen Sie am unteren Rand Folgendes hinzu didMove (bis :)
Methode.
func didMove überschreiben (zur Ansicht: SKView) … let video = SKVideoNode (Dateiname: "video.mov") video.position = CGPoint (x: size.width / 2, y: 600) addChild (video) video.play ( )
Hier haben wir den Intiailizer verwendet init (Dateiname :)
ein Video erstellen. Sie übergeben den Namen des Videos zusammen mit der Erweiterung. Ich habe dem Quellcode des Projekts kein Video beigefügt. Wenn Sie diese Arbeit jedoch sehen möchten, können Sie ein Video mit dem Namen "video.mov"zu Ihrem Projekt.
Damit ist unsere Studie zu Knoten abgeschlossen. Nachdem Sie diesen Beitrag und den vorherigen gelesen haben, sollten Sie ein gutes Verständnis davon haben SKNode
s und ihre Unterklassen. Im nächsten Teil dieser Serie werden wir einen Blick darauf werfen SKActions
und mit Physik in unseren Spielen. Danke fürs Lesen, und wir sehen uns dort!
In der Zwischenzeit können Sie einige unserer anderen großartigen Kurse und Tutorials zum Erstellen von iOS-Apps mit Swift und SpriteKit ausprobieren.
Schauen Sie sich auch unsere SpriteKit-Kurse an! Diese führen Sie durch alle Schritte beim Erstellen Ihres ersten SpriteKit-Spiels für iOS, auch wenn Sie noch nie mit SpriteKit programmiert haben.