我正在为游戏分配资源。我有一个超类BaseScene,两个孩子GameScene和HyperScene。
GameScene和HyperScene都在另一个线程上预加载他们的资源,但他们用来执行此操作的方法基本相同。
GameScene
class func createResources(config: GameSceneConfig, withCompletion: (scene: GameScene) -> ()){
// load resources on other thread
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), {
self.createTextures() // need to load textures before scene is created
let gameScene = GameScene(config: config)
// callback on main thread
dispatch_async(dispatch_get_main_queue(), {
// Call the completion handler back on the main queue.
withCompletion(scene: gameScene)
});
})
}
BaseScene
class func createResources(config: HyperSceneConfig, withCompletion: (scene: HyperScene) -> ()){
// load resources on other thread
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), {
self.createTextures()
let hyperScene = HyperScene(config: config)
// callback on main thread
dispatch_async(dispatch_get_main_queue(), {
// Call the completion handler back on the main queue.
withCompletion(scene: hyperScene)
});
})
}
config是一个包含参数的结构。 HyperScene和GameScene都有自己的特殊结构。在我的createResources
方法中,我非常确定我可以声明BaseScene
,然后在调用方法时将其作为其子项之一抛出。似乎大多数困难在于传递一个通用结构。
这是两个结构
struct HyperSceneConfig {
var size: CGSize
var viewController: GameViewController
init(size: CGSize, viewController: GameViewController){
self.size = size
self.viewController = viewController
}
}
struct GameSceneConfig {
var size: CGSize
var viewController: GameViewController
var curLevel: Int
var curSector: Int
var lives: Int
init(size: CGSize, viewController: GameViewController, curSector: Int, curLevel: Int, lives: Int = 3, startPoint: CGPoint? = nil){
self.size = size
self.viewController = viewController
self.curLevel = curLevel
self.curSector = curSector
self.lives = lives
}
}
HyperScene将第一个作为参数。 GameScene选择了第二个。
答案 0 :(得分:0)
让您的GameSceneConfig
和HyperSceneConfig
延伸到同一个班级。然后只需调用它们的通用初始化程序。
修改
class func createResources(config: GameSceneConfig, withCompletion: (scene: GameScene) -> ())
要
class func createResources(config: configName, withCompletion: (scene: GameScene) -> ()) ->())
你在哪里
让hyperScene = HyperScene(config:config)
那就变成了
let scene = sceneInit(config: configName)
创建一个sceneInit来处理你对场景的任何需求。