我正在开发一个应用程序,我在一个类中编写了SKScene
的大部分内容。它工作得很好,但是当我在上学期学习(java)课程时,似乎接受的行业惯例是将它分成许多类。
更具体地说,我的(SpriteKit)应用程序包含一只猫和一只鼠标,在完成所述课程后,我决定不将其中的所有信息包含在SKScene
中,而是将其中的一些分成多个类(具有Player
和Cat
子类的Mouse
超类,每个超类包含其相关信息(例如x和y位置)和函数(例如moveCat
),仅与场景相关Scene类中的函数和信息。
问题位于函数的内容中。
特别是其中一个函数pathBlocked
(检查是否存在阻碍所需移动路径的障碍)使用了大量信息,这些信息在Player
对象内部包含起来没有意义(例如关于板上障碍的所有信息,以及收集了多少奶酪)。
我不能将pathBlocked
作为Scene
函数,因为有一个函数属于使用catAI
导航的cat(pathBlocked
)。如果它是场景的一种方法,那么它将无法工作。每次我想调用pathBlocked
时,我都需要实例化一个Scene对象。
我应该忘记制作Cat
和Mouse
类,还是应该在Player
课程中填写不完全属于的信息?
还是有第三种我不想的选择?
如果你需要一段代码,我可以加入一些代码。
谢谢!
答案 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
}
基本上抛出你不想看的所有其他功能,只占用实际场景文件中的空间。它在同一个文件中就像它一样,所以你可以在这里调用任何函数,或者使用任何一个类中的任何变量。