Spieleentwicklung mit SpriteKit Teil 3

Hier kommt nun der dritte und letzte Teil.

Heute beschäftigen wir uns mit dem Code.

Ein Spiel sollte mit einem Klick auf den Schließ-Knopf beendet werden können. Das lässt sich einfach zufügen im AppDelegate. Dort finden sich alle Funktionen, die die gesamte Anwendung betreffen.

Fügen Sie folgenden Code hinzu: 

func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {

        return true

  }

Das war der einfache Teil. 

Nun gehen wir zum ViewController. Wie gehabt finden Sie hier die Funktion viewDidLoad, die alles für das Spiel vorbereitet. 

    override func viewDidLoad() {

        super.viewDidLoad()

        if let view = self.skView {

            // Load the SKScene from 'GameScene.sks'

            if let scene = SKScene(fileNamed: "GameScene") {

                // Set the scale mode to scale to fit the window

                scene.scaleMode = .aspectFill

                // Present the scene

                view.presentScene(scene)

            }

            view.ignoresSiblingOrder = true

            view.showsFPS = true

            view.showsNodeCount = true

        }

    }

Dieses lädt die Szene aus der Datei GameScene.sks, passt die Größe an und zeigt sie an. Auch hier kann man dies leicht verstehen. 

Am Ende kommt die Datei GameScene.swift, und damit die Magie.

Hier lohnt es sich genauer hinzusehen. In der Klasse GameScene legen wir zwei Variablen an: Den Hintergrund als SpriteNode und einen Zähler als Integer.

private var backgroundPicture:SKSpriteNode?

 private var zaehler:Int! = 0

In der Funktion didMove weisen wir den Variablen ihre Inhalte zu:

override func didMove(to view: SKView) {

        self.backgroundPicture = self.childNode(withName: "//Background") as? SKSpriteNode

        let c = self.backgroundPicture?.children

        zaehler = c?.count

    }


Da die SpriteKit Bibliothek vorrangig für iOS und damit Touchbedienung entwickelt wurden, arbeiten wir mit der Funktion touchDown. Auf dem Mac ist das die Maus. Standardmäßig wird trotzdem die Funktion touchDown aufgerufen und fertig. 

Daher fügen Sie bitte folgenden Code in die Funktion touchDown ein: 

func touchDown(atPoint pos : CGPoint) {

let fo = SKAction.fadeOut(withDuration: 0.5)

let rm = SKAction.removeFromParent()

let s = SKAction.sequence([fo, rm])

let touchedNode = scene?.atPoint(pos)

if (touchedNode?.name != "Background") {

touchedNode?.run(s)

zaehler = zaehler - 1

print(zaehlerasAny)

}

ifzaehler == 0 {

print("Gewonnen!")

}

    }

Was passiert hier?

Wir wollen die angeklickten Bilder vom Bildschirm entfernen. Das wollen wir aber "schön" machen mit einem FadeOut. Also definieren wir zwei Actions. Einmal Fadeout und einmal RemoveFromParent. Damit diese hintereinander ablaufen definieren wir noch eine Sequenz. 

Wir holen uns den Knoten, der angeklickt wurde. Dann fragen wir, ob der Knoten nicht der Hintergrund war. Wenn ja, lassen wir den Knoten die Sequenz abspielen und subtrahieren eins vom Zähler. Das wir die Variable noch ins Log schreiben dient nur Debugzwecken. Sobald der Zähler Null ist, haben wir gewonnen.

Das war es schon. Lassen Sie das Spiel ausführen.

Das Elegante in unserem Ansatz: Es ist egal ob sie ein Wimmelbild mit fünf oder 50 Bildern erstellen wollen: Der Code funktioniert immer. Sie müssen den zu suchenden Bildern auch keinen Namen geben. 

Nun zu den Verbesserungen:

  • Natürlich bessere und ausgeklügeltere Grafiken.
  • Sobald Sie gewonnen haben, sollte der Schriftzug "Gewonnen" auf dem Spiel erscheinen.
  • Vielleicht auch mit Tönen arbeiten, dafür gibt es eine eigene Aktion. 
  • Anzeigen wie viele Bilder zu finden sind. 
  • mehrere Szenen.
  • usw.

Das ist hier nur ein kleiner Test. Das gleiche Prozedere können Sie natürlich auch für Point and Click Adventures nutzen.