Question

I have an issue where my SKView's background color (grey) is briefly being displayed before the scene is presented.

I manually attempted to set it, both via the Storyboard editor and in my controller (self.skView.backgroundColor = [SKColor blueColor]) but it remains grey. Is this not an attribute that can be overridden?

Update #1

Here's a little explanation as to what happening:

  1. viewDidLoad is called and skView is presented on the screen w/ a grey background (skView.scene is not set yet).
  2. I load all of the game's assets (which takes ~1 second) and during this point the grey background is visible.
  3. After the assets have been loaded I load the scene and present it (the grey screen is replaced w/ the contents of the scene)

ViewController

- (void)viewDidLoad
{
    [self.activityIndicator startAnimating];
    [self authenticatePlayer];

    self.skView.backgroundColor = [SKColor blueColor];

    // During this time the grey screen is visible as the assets are being loaded and take ~1 second
    // self.skView.scene is NULL here so I cannot set the backgroundColor...

    [GamePlayScene loadSceneAssetsWithCompletionHandler:^{
        [self.activityIndicator stopAnimating];
        self.activityIndicator.hidden = YES;

        CGSize viewSize = self.skView.bounds.size;

        self.gamePlayScene = [[GamePlayScene alloc] initWithSize:viewSize];
        self.adView.autoresizingMask = UIViewAutoresizingFlexibleWidth;

        [self.skView presentScene:self.gamePlayScene];

    }];
    ...
Was it helpful?

Solution

I'm afraid you'll either have to present your scene with the most basic setup done (like setting backgroundColor) and then load the rest, or present a "loading" scene until the gameplay scene loads, then replace it.

OTHER TIPS

I think you have mistaken it for the SKScene property of the same name:

self.scene.backgroundColor = [SKColor blueColor];

Note that self.scene (also self.view) will be nil until after the node has been added as child to another node (that is already part of the scene graph) respectively until the scene was presented.

You should be able to set the SkView background colour in the presenting view controllers viewDidLoad - prior to presenting the view. Is this not happening?

Providing you've added it to a parent node

Using the basic template for sprite kit I was able to set the background to black with this code inside of the GameViewController.m file:

- (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:skView.bounds.size];
scene.scaleMode = SKSceneScaleModeAspectFill;
scene.backgroundColor = [UIColor blackColor];

// Present the scene.
[skView presentScene:scene];
}

Not sure if this is exactly what you were looking for but it got rid of the grey background that didn't seem to go away. In your case I think you would want to set the "gamePlayScene" background color property after initializing the scene.

Hope this helps!

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top