Metody inicjujące powinny być używane do inicjowania, ale należy pamiętać, że wewnątrz init widok zawsze jest nil
. Więc każdy kod, który potrzebuje widoku, musi zostać przeniesiony do metody didMoveToView (jest wywoływany natychmiast po przedstawieniu sceny przez widok).
O initWithSize
w Xcode 6 ... Domyślnie scena jest ładowana z pliku .sks. Z tego powodu initWithSize
nigdy nie jest wywoływany. initWithCoder
nazywa zamiast:
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder]) {
// do stuff
}
return self;
}
więc inicjowanie czegokolwiek wewnątrz initWithSize
nie będzie miał żadnego wpływu. Jeśli zdecydujesz się usunąć .sks plik i utworzyć scenę w „starych” sposób można zrobić coś takiego w widoku kontrolera:
- (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];
}
Po tym, można użyć initWithSize
dla inicjalizacji.
Należy zauważyć, że w viewDidLoad ostateczny rozmiar widoku może nie być jeszcze znany, a użycie viewWillLayoutSubviews
może być dobrym wyborem. Czytaj więcej here.
i właściwe wdrożenie viewWillLayoutSubviews dla celów inicjalizacji scena będzie:
- (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];
}
}
Kod 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)
}
}
}