我应该在哪里放置我的功能?

时间:2016-06-17 16:56:47

标签: swift function class object skscene

我正在开发一个应用程序,我在一个类中编写了SKScene的大部分内容。它工作得很好,但是当我在上学期学习(java)课程时,似乎接受的行业惯例是将它分成许多类。

更具体地说,我的(SpriteKit)应用程序包含一只猫和一只鼠标,在完成所述课程后,我决定不将其中的所有信息包含在SKScene中,而是将其中的一些分成多个类(具有PlayerCat子类的Mouse超类,每个超类包含其相关信息(例如x和y位置)和函数(例如moveCat),仅与场景相关Scene类中的函数和信息。

问题位于函数的内容中。

特别是其中一个函数pathBlocked(检查是否存在阻碍所需移动路径的障碍)使用了大量信息,这些信息在Player对象内部包含起来没有意义(例如关于板上障碍的所有信息,以及收集了多少奶酪)。

我不能将pathBlocked作为Scene函数,因为有一个函数属于使用catAI导航的cat(pathBlocked)。如果它是场景的一种方法,那么它将无法工作。每次我想调用pathBlocked时,我都需要实例化一个Scene对象。

我应该忘记制作CatMouse类,还是应该在Player课程中填写不完全属于的信息?

还是有第三种我不想的选择?

如果你需要一段代码,我可以加入一些代码。

谢谢!

1 个答案:

答案 0 :(得分:1)

好的,你应该做的是

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
    }
}

然后在场景中,你可以这样做:

class GameScene: SKScene {
    var cat: Cat?

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

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

我想你每次使用它都需要打开它,但XCode会告诉你。

^应该归功于AMomchilov,在此之前我根本不知道弱引用。这是一个有趣的学习经历XD。

如果你想组织你的代码,你可以做的另一种方法是为你的场景添加一个扩展文件,并在那里抛出所有低级函数,并保留实际场景类中的所有高级函数。创建一个新类,并将其命名为SceneExtension或其他:

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
}

基本上抛出你不想看的所有其他功能,只占用实际场景文件中的空间。它在同一个文件中就像它一样,所以你可以在这里调用任何函数,或者使用任何一个类中的任何变量。