Не удалось установить SKView backgroundColor

У меня проблема, когда цвет фона моего SKView (серый) ненадолго отображается перед представлением сцены.

Я попытался установить его вручную, как через редактор раскадровки, так и в моем контроллере (self.skView.backgroundColor = [SKColor blueColor]), но он остается серым. Разве это не атрибут, который можно переопределить?

Обновление №1

Вот небольшое объяснение того, что происходит:

  1. Вызывается viewDidLoad, а skView отображается на экране с серым фоном (skView.scene еще не установлено).
  2. Я загружаю все активы игры (что занимает ~ 1 секунду), и в этот момент виден серый фон.
  3. После загрузки ресурсов я загружаю сцену и представляю ее (серый экран заменяется содержимым сцены)

Вьюконтроллер

- (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];

    }];
    ...

person Kyle Decot    schedule 26.02.2014    source источник


Ответы (4)


Боюсь, вам придется либо представить свою сцену с самой базовой выполненной настройкой (например, установить backgroundColor), а затем загрузить остальные, либо представить «загрузку» сцены до загрузки сцены игрового процесса, а затем заменить ее.

person Filip Radelic    schedule 26.02.2014
comment
Проблема в том, что self.skView.scene на короткое время имеет значение null (см. мой обновленный вопрос). - person Kyle Decot; 27.02.2014
comment
Да, похоже, что SKView поддерживается CEAGLLayer, как и GLKView. Так вот откуда взялся серый цвет. Изменить это возможно (на SO есть несколько ответов), но я думаю, что в этом случае это немного излишне. Взгляните на мой обновленный ответ. - person Filip Radelic; 27.02.2014

Я думаю, вы перепутали его с одноименное свойство SKScene:

self.scene.backgroundColor = [SKColor blueColor];

Обратите внимание, что self.scene (также self.view) будет нулевым до тех пор, пока узел не будет добавлен как дочерний к другому узлу (который уже является частью графа сцены) соответственно, пока сцена не будет представлена.

person LearnCocos2D    schedule 26.02.2014
comment
Разве SKView просто не наследуется от UIView (у которого есть свойство backgroundColor)? - person Kyle Decot; 27.02.2014
comment
Кроме того, я обновил свой вопрос с некоторыми дополнительными деталями. - person Kyle Decot; 27.02.2014
comment
Больше подробностей не нужно, дело довольно ясное. Вам нужно изменить свойство backgroundColor SKScene, а не представление. Представление имеет то же свойство, но сцена — это то, что визуализируется (непрозрачно) в/на представление, поэтому действует только цвет фона сцены. - person LearnCocos2D; 27.02.2014
comment
skView.scene равно null (в том смысле, о котором я говорю), поэтому установить его невозможно. - person Kyle Decot; 27.02.2014
comment
затем измените цвет сразу после представления сцены, соответственно, непосредственно перед ее представлением, когда вы создаете сцену внутри контроллера представления. - person LearnCocos2D; 27.02.2014
comment
также, если для загрузки сцены требуется время, сначала отобразите пустую сцену с желаемым цветом загрузки или спрайтом. - person LearnCocos2D; 27.02.2014
comment
^ Это то, что я в итоге сделал, и это кажется приемлемым решением (пока). - person Kyle Decot; 27.02.2014

Вы должны иметь возможность установить цвет фона SkView в контроллерах представлений viewDidLoad - до представления представления. Разве этого не происходит?

При условии, что вы добавили его в родительский узел

person davbryn    schedule 26.02.2014

Используя базовый шаблон для набора спрайтов, я смог установить черный фон с помощью этого кода внутри файла GameViewController.m:

- (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];
}

Не уверен, что это именно то, что вы искали, но он избавился от серого фона, который, казалось, никуда не делся. В вашем случае, я думаю, вы захотите установить свойство цвета фона «gamePlayScene» после инициализации сцены.

Надеюсь это поможет!

person johnnelm9r    schedule 22.11.2014
comment
OP запросил цвет фона SKView, а не SKScene - person Jakub Truhlář; 15.12.2015
comment
Я понимаю, что это было не совсем то, чего хотел ОП, но это работает и может быть самым простым решением. Я не думаю, что это имеет какие-либо побочные эффекты, поэтому одно против другого не имеет значения. :) - person johnnelm9r; 15.12.2015