【问题标题】:Where should I put my functions?我应该把我的功能放在哪里?
【发布时间】:2016-06-17 16:56:46
【问题描述】:

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

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

问题在于函数的内容。

特别是其中一个功能,pathBlocked(它检查是否有任何障碍物阻挡了所需的移动路径)使用了很多在 Player 对象中没有意义的信息(例如所有有关板上障碍物的信息,以及收集了多少奶酪)。

我不能只将pathBlocked 保留为Scene 函数,因为有一个函数应该属于猫(catAI),它使用pathBlocked 进行导航。如果是场景的方法,那就不行了。每次我想调用 pathBlocked 时,我都需要实例化一个 Scene 对象。

我应该忘记创建CatMouse 类,还是应该用不完全属于的信息填充Player 类?

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

如果您需要代码的 sn-p,我可以包含其中的一些。

谢谢!

【问题讨论】:

  • pathBlocked 在我看来是最合适的场景方法。
  • 忘了说,猫有一个catAI 方法,它调用pathBlocked。如果是场景的方法,那就不行了。每次我想调用pathBlocked 时,我不必实例化一个场景对象吗?
  • 你的猫对象可以持有对其父场景的弱引用,并查询它以获取此类信息

标签: swift function class object skscene


【解决方案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
}

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

【讨论】:

  • 弱引用会随着场景变化吗?如果场景包含变量,当场景变量发生变化时,弱引用的变量是否会发生变化
  • 是的。如果您检查if scene.cheeseObtained &gt;= 5 或其他内容,它将是准确的,但是如果您确实喜欢var cheese = scene.cheeseObtained,然后在场景类中进行了 cheeseObtained 更改,则您刚刚制作的“奶酪”变量将不会更新,但如果您这样做了@再次987654326@,它会再次准确。我会 brb,我会测试一些东西并确保它是正确的,不想误导 XD。
  • 我自己测试过,所有变量都是最新的。所以如果你需要当前的 x 位置,你可以这样做:sceneRef!.childNodeWithName("cat").position.x
  • 太棒了!非常感谢您的努力和时间:) 非常感谢
猜你喜欢
  • 2015-11-04
  • 1970-01-01
  • 2020-09-30
  • 2019-07-11
  • 1970-01-01
  • 2016-08-25
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多