我很欣赏这不是特定于Swift的,但我正在Swift中编写一个小游戏,因此我用相关标签标记了它。我是Swift语言的新手,但很快就把它拿起来,虽然对于一般的编程并不陌生,但是经常会质疑我的方法。
以下是我的情景:
我正在编写一个带有玩家角色和各种障碍的小型2D平台游戏。玩家可以拥有不同的纹理,但通常具有相同的功能,例如跳跃和冲刺。同样,障碍物通常具有不同的纹理,但是否则具有相同的能力。
角色和障碍物也有共同的能力,但不是全部,例如障碍物无法跳跃。考虑到这一点,这就是我编写课程的方式......
class GameObject {
let node : SKSpriteNode!
}
Class GameObstacle: GameObject {
init() {
super.init()
}
func explode() {
// explode code
}
}
class GameCharacter: GameObject {
init() {
super.init()
}
func jump() {
// jump code
}
}
class GameCharacter_Sheep : GameCharacter {
init() {
super.init()
self.node = SKSpriteNode(namedFile: "sheep")
}
}
这种方法背后的逻辑是所有常见的对象功能都包含在GameObject类中,所有常见的字符功能(如跳转)都包含在字符类和独特的东西中,在类级别下来
我有一个问题,我在GameCharacter_Sheep类中初始化我的节点(在我的GameObject类中定义)是否正确?我的理由是,因为纹理,物理体在不同角色之间会有所不同,那么这个实现的正确位置是什么?
同样,我很欣赏这可能是基本的OOP而不是特定的Swift,但我只是在寻找一些指导。
非常感谢, 乔恩
答案 0 :(得分:0)
如果你的所有游戏对象都有一个SKSpriteNode
实例从命名文件中传递数据,你可以将它的创建移动到基类中,只需要传递名为的文件进入super.init()
的电话。
更一般地说,继承并不是在不同游戏对象之间共享功能的唯一选择。不要忘记组合,这在定义游戏对象时通常是首选,以避免深层,不灵活的继承层次结构,有时无法模拟所需的行为。有很多方法可以一直到达一个完整的基于游戏对象组件的系统。