2016-06-17 18 views
0

Ich arbeite an einer App und ich schrieb einen großen Teil einer SKScene in einer einzigen Klasse. Es funktioniert gut, aber als ich im vergangenen Semester einen (Java) Kurs besucht habe, scheint es gängige Praxis zu sein, es in viele Klassen zu unterteilen.Wo sollte ich meine Funktionen einstellen?

Genauer gesagt, meine (SpriteKit) App enthält eine Katze und eine Maus und nach Verlauf die Bearbeitung, ich entscheide, dass stattdessen alle ihre Informationen in der SKScene zu enthalten, habe ich einen Teil davon in mehrere Klassen trennen sollte (a Player Super mit Cat und Unterklassen), die jeweils ihre relevanten Informationen (wie x- und y-Position) und Funktionen (wie moveCat) mit nur Szenenbezogenen Funktionen und Informationen in der Klasse Scene enthalten.

Das Problem liegt im Inhalt der Funktionen.

Besonders eine der Funktionen, pathBlocked (die überprüft, ob es irgendwelche Hindernisse sind die gewünschte Bewegungsbahn zu blockieren) verwendet eine Menge von Informationen, die nicht sinnvoll wäre, innerhalb des Player Objekt (zB alle Infos enthalten über die Barrieren auf dem Brett und wie viel Käse wurde gesammelt).

Ich kann nicht nur pathBlocked als Scene Funktion verlassen, weil es eine Funktion ist, die die Katze (catAI), die pathBlocked zu navigieren verwendet gehören soll. Wenn es eine Methode der Szene ist, wird es nicht funktionieren. Ich müsste jedes Mal ein Szenenobjekt instanziieren, wenn ich pathBlocked anrufen wollte.

Sollte ich nur vergessen, über die Herstellung der Cat und Mouse Klassen oder sollte ich die Player Klasse mit Informationen füllen, die nicht ganz gehört?

oder gibt es eine dritte Option, an die ich nicht denke?

Wenn Sie ein Code-Schnipsel benötigen, könnte ich etwas davon hinzufügen.

Danke!

+0

'pathBlocked' scheint mir als eine Methode der Szene am geeignetsten zu sein. – Alexander

+0

vergessen zu erwähnen, hat die Katze eine 'catAI' Methode, die' pathBlocked' aufruft. Wenn es eine Methode der Szene ist, wird es nicht funktionieren. Müsste ich nicht jedes Mal ein Szenenobjekt instantiieren, wenn ich 'pathBlocked' aufrufen wollte? –

+1

Ihr cat-Objekt kann eine schwache Referenz auf seine Elternszene halten und nach solchen Informationen abfragen. – Alexander

Antwort

1

Ok, was so sollten Sie tun, ist

class Cat { 
    var sceneRef: GameScene? //or whatever scene is called 
    var xPos: CGFloat! 
    var yPos: CGFloat! 

    init(s: GameScene){//just example stuff 
     sceneRef = s 
     xPos = sceneRef!.childNodeWithName("cat").position.x 
     yPos = sceneRef!.childNodeWithName("cat").position.y //However, these variables will not stay up to date. If you need them current, you would have to do the same thing again, xPos = sceneRef!.childNode...etc. 
    } 

    func doStuff{ 

    } 

    func createNewPath() 
     //create a new path 
    } 
} 

Dann in der Szene, die Sie tun können:

class GameScene: SKScene { 
    var cat: Cat? 

    override init(size: CGSize){ 
     super.init(size: size) 
     cat = Cat(s: self) 

    func whatever() { 
     if (pathBlocked()){ 
      cat!.createNewPath() 
     } 
    } 

Ich glaube, Sie werden es einfach jedes Mal, wenn Sie es verwenden, auspacken müssen, aber XCode wird dir das sagen.

^Kredit für das sollte gehen AMomchilov, ich wusste überhaupt nicht über schwache Referenzen überhaupt. Es war eine lustige Lernerfahrung XD.

Wenn Sie Ihren Code organisieren möchten, können Sie auch eine Erweiterungsdatei für Ihre Szene erstellen und alle Funktionen der Low-Level-Funktion dort hineinwerfen und alle wichtigen Inhalte in der aktuellen Szene behalten Klasse. Machen Sie eine neue Klasse, und nennen es SceneExtension oder etwas:

import SpriteKit 
//import whatever else you need 

extension GameScene { //<- Or whatever your previous scene that you want to extend is called 

    func pathBlocked() { 
     //function code 
    } 

    //other functions 
} 

Und im Grunde alle anderen Funktionen werfen, die Sie nicht wollen, zu betrachten und nur nehmen Platz in der aktuellen Szene-Datei. Es verhält sich wie es in der gleichen Datei, so dass Sie jede der Funktionen hier aufrufen können, oder verwenden Sie Variablen aus jeder Klasse.

+0

Ändert sich die schwache Referenz mit der Szene? Wenn die Szene eine Variable enthält, ändert sich die Variable der schwachen Referenz, wenn sich die Variablen der Szene ändert. –

+0

Ja. Wenn Sie 'if scene.cheeseObtained> = 5' oder etwas überprüfen, wird es korrekt sein, aber wenn Sie' var cheese = scene.cheeseObtained' mögen, und dann cheeseObtained Änderungen in der Szenen-Klasse, die Variable, die Sie gerade gemacht haben " Käse "wird nicht aktualisiert, aber wenn Sie' Käse = scene.cheeseObtained' wieder getan haben, wäre es wieder korrekt. Ich werde brüllen, etwas schlechtes testen und sicherstellen, dass es richtig ist, nicht XD in die Irre führen wollen. – Arkidillo

+0

Ich habe es selbst getestet, und alle Variablen bleiben auf dem neuesten Stand. Wenn Sie also die aktuelle x-Position benötigen, können Sie Folgendes tun: 'sceneRef! .childNodeWithName (" cat "). position.x' – Arkidillo

Verwandte Themen