ios – 何时在xCode 6.4中使用带有SpriteKit的didMoveToView或in
发布时间:2020-12-15 01:48:49 所属栏目:百科 来源:网络整理
导读:由于xCode已更新为6.0版,因此“GameScene”(创建的默认场景)中SpriteKit的默认方法更改为: -(void) didMoveToView:(SKView *) view {/* Scene set up in here */} 与旧方法相反: -(id) initWithSize:(CGSize) size { if (self = [super initWithSize:size]
由于xCode已更新为6.0版,因此“GameScene”(创建的默认场景)中SpriteKit的默认方法更改为:
-(void) didMoveToView:(SKView *) view { /* Scene set up in here */ } 与旧方法相反: -(id) initWithSize:(CGSize) size { if (self = [super initWithSize:size]{ /* Scene set up in here */ } } 我知道新方法(与视图控制器中的更改一样)用于帮助管理xCode 6中新增的.sks文件的导入.但是,如果我不想使用新的,我很好奇作为.sks文件的“storyboard”类型格式,我还应该使用新方法吗?或者我应该将方法更改回initWithSize方法并删除.sks文件? 解决方法
应该使用Init方法进行初始化,但请记住,在init内部,视图总是为零.因此,任何需要视图的代码都必须移动到
didMoveToView方法(在视图呈现场景后立即调用).
关于Xcode 6中的initWithSize …默认情况下,场景是从.sks文件加载的.因此,initWithSize实际上从未被调用过.而是调用initWithCoder: - (instancetype)initWithCoder:(NSCoder *)aDecoder { if (self = [super initWithCoder:aDecoder]) { // do stuff } return self; } 因此初始化initWithSize中的任何内容都不会有任何影响.如果您决定删除.sks文件并以“旧”方式创建场景,则可以在视图控制器中执行以下操作: - (void)viewDidLoad { [super viewDidLoad]; // Configure the view. SKView * skView = (SKView *)self.view; skView.showsFPS = YES; skView.showsNodeCount = YES; /* Sprite Kit applies additional optimizations to improve rendering performance */ skView.ignoresSiblingOrder = YES; // Create and configure the scene. GameScene *scene = [GameScene sceneWithSize:self.view.bounds.size]; scene.scaleMode = SKSceneScaleModeAspectFill; // Present the scene. [skView presentScene:scene]; } 之后,您可以使用initWithSize进行初始化. 请注意,在viewDidLoad中,视图的最终大小可能尚未知晓,而使用viewWillLayoutSubviews可能是正确的选择.阅读更多here. 正确实现viewWillLayoutSubviews用于场景初始化的目的是: - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; // Configure the view. SKView * skView = (SKView *)self.view; skView.showsFPS = YES; skView.showsNodeCount = YES; /* Sprite Kit applies additional optimizations to improve rendering performance */ skView.ignoresSiblingOrder = YES; //viewWillLayoutSubviews can be called multiple times (read about this in docs ) so we have to check if the scene is already created if(!skView.scene){ // Create and configure the scene. GameScene *scene = [GameScene sceneWithSize:self.view.bounds.size]; scene.scaleMode = SKSceneScaleModeAspectFill; // Present the scene. [skView presentScene:scene]; } } SWIFT代码: override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene { // Configure the view. let skView = self.view as SKView skView.showsFPS = true skView.showsNodeCount = true skView.showsPhysics = true skView.showsDrawCount = true /* Sprite Kit applies additional optimizations to improve rendering performance */ skView.ignoresSiblingOrder = true /* Set the scale mode to scale to fit the window */ if(skView.scene == nil){ scene.scaleMode = .AspectFill scene.size = skView.bounds.size skView.presentScene(scene) } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |