【问题标题】:Unable to set SKView backgroundColor无法设置 SKView 背景颜色
【发布时间】:2014-03-29 23:14:46
【问题描述】:

我遇到了一个问题,即我的 SKView 的背景颜色(灰色)在呈现场景之前会短暂显示。

我通过 Storyboard 编辑器和我的控制器 (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];

    }];
    ...

【问题讨论】:

    标签: ios objective-c ios7 sprite-kit skview


    【解决方案1】:

    我想你把它误认为SKScene property of the same name

    self.scene.backgroundColor = [SKColor blueColor];
    

    请注意,self.scene(也称为self.view)将为零,直到将节点作为子节点添加到另一个节点(已经是场景图的一部分)之后,直到呈现场景。

    【讨论】:

    • SKView 不只是继承自 UIView(它有一个 backgroundColor 属性)吗?
    • 另外,我更新了我的问题并提供了更多细节。
    • 不需要更多细节,案例很清楚。您需要更改 SKScene 的 backgroundColor 属性,而不是视图的。视图具有相同的属性,但场景是被渲染(不透明)到视图中的内容,因此只有场景的背景颜色生效。
    • skView.scenenull (我正在谈论)所以没有办法设置它。
    • ^ 这就是我最终做的,这似乎是一个可以接受的解决方案(到目前为止)。
    【解决方案2】:

    您应该能够在呈现视图控制器viewDidLoad 中设置SkView 背景颜色 - 在呈现视图之前。这没有发生吗?

    假设您已将其添加到父节点

    【讨论】:

      【解决方案3】:

      恐怕您要么必须在完成最基本的设置(如设置背景颜色)后呈现场景,然后加载其余部分,要么在游戏场景加载之前呈现“正在加载”场景,然后替换它。

      【讨论】:

      • 问题是self.skView.scene 在短时间内为空(请参阅我更新的问题)。
      • 是的,SKView 似乎是由 CAEAGLLayer 支持的,就像 GLKView 一样。这就是灰色的来源。改变它是可能的(有一些关于 SO 的答案),但我认为对于这种情况,这有点矫枉过正。看看我更新的答案。
      【解决方案4】:

      使用 sprite kit 的基本模板,我可以在 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”背景颜色属性。

      希望这会有所帮助!

      【讨论】:

      • OP 要求 SKView 背景颜色,而不是 SKScene
      • 我知道这不是 OP 想要的,但它可以工作并且可能是最简单的解决方案。我不认为它有任何不利影响,所以做一个与另一个是无关紧要的。 :)
      猜你喜欢
      • 2016-10-04
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      • 2015-06-06
      • 2013-12-20
      • 1970-01-01
      • 2023-03-04
      相关资源
      最近更新 更多