我正在开发spritekit游戏并完成第一级游戏。对于级别1,我使用.sks文件来布局场景并将其链接到GameScene.swift文件以获取逻辑。
当我进入下一个级别时,很可能称为" GameScene2.swift"有没有办法可以引用已完成的Gamescene.swift文件作为我的下一个级别的基础,然后根据需要覆盖?像didMoveto和didBegin这样的东西在各级之间大致相同。
我一直在谷歌上搜索这个概念,但是还没有找到很多东西,我真的不知道该怎么称呼这个概念,这可能就是我无法理解的原因找到很多。任何见解将不胜感激。
答案 0 :(得分:1)
是的,您可以将原始的Gamescene子类化,并从您正在创建的其他游戏场景中继承其所有功能。
因此,您将创建一个继承自SKScene的原创游戏场景,如下所示:
class OriginalGameScene: SKScene {
// all of your shared logic here (didMoveTo and didBegin) functions
}
对于项目中的所有游戏场景,只需继承原始游戏场景:
class FirstGameScene: OriginalGameScene {
// this class has the logic from the functions didMoveTo and didBegin
}
只在您OriginalGameScene
中的每个其他游戏场景中放置您想要共享的逻辑,并且您将能够访问您在OriginalGameScene
文件中实现的任何功能或逻辑。
答案 1 :(得分:1)
我的处理方式略有不同。
我将所有核心游戏引擎的东西放在我的GameScene.swift和GameScene.sks文件中(即。gameHUD,播放器,得分,暂停等等)
然后我将Level1.sks,Level2.sks等分别创建我的关卡文件。但是这些将是类类型Level,这样你就不必再重复每个级别的通用内容了。 Level.sks文件。 然后我加载GameScene文件并处理所有级别的通用对象。
然后我加载我的等级。重要的是要注意,当这样做并为Levels和GameScene设置单独的sks文件时,您必须在加载它们时将对象从Level文件移动到GameScene。 func createLevel(levelID:Int){
if let levelNode = SKReferenceNode(fileNamed: "Level\(levelID)") {
if let background = levelNode.childNode(withName: "backgroundTiles") as? SKTileMapNode {
background.move(toParent: self)
}
if let water = levelNode.childNode(withName: "waterTiles") as? SKTileMapNode {
water.move(toParent: self)
}
if let badGuy = levelNode.childNode(withName: "badGuy") as? SKSpriteNode {
self.badGuy = badGuy
badGuy.move(toParent: self)
}
}
}
编辑新解释
想象一下你创造了一个pacman游戏。
弄清楚任何级别的共同点。在这种情况下... - 吃豆子酱 - 得分标签 - 制表分数 - 幽灵运动 - pacman的运动 - 水果运动
接下来弄清楚每个级别的独特之处 - 幽灵起始位置 - 迷宫 - 水果开始位置
因此,在您的GameScene.sks文件中,您的分数标签和每个级别上发生的任何GUI
在您的GameScene.swift文件中处理设置您在sks文件中布局的任何GUI。还处理幽灵的运动,吃水的运动,水果的运动,得分处理,物理等。
在单个SKS文件Level1,Level2等中创建迷宫。这允许您按照图形方式布置每个迷宫,您还可以在每个级别放置鬼魂起始位置,以及每个级别放置水果起始位置。
在GameScene内部,您可以根据播放器所在的级别加载level.sks文件。当你加载sks文件时,你现在根据从level.sks文件加载的信息放置鬼,物理,水果等。
所以现在你有了一个很好的流媒体GameScene文件来处理所有的核心功能,没有任何重复,所有特定级别的信息都存储在你的Level.sks文件中。