【问题标题】:SKReferenceNode issue in iOS 11iOS 11 中的 SKReferenceNode 问题
【发布时间】:2017-10-23 13:31:09
【问题描述】:

我发现了一个从 iOS 11 开始的奇怪问题,我的应用程序不会更新我的 SKReferenceNode 上的精灵。基本上,我有一个带有页眉和页脚的“覆盖”节点(我用于多个场景的 SKS 文件)。在标题中,有一个得分栏,当玩家得分时会扩大。我正在使用 SKAction 为得分栏设置动画。从 iOS 11 开始,评分栏不再出现。它发生在模拟器和设备上。有趣的是,如果我通过调试器暂停/恢复应用程序,评分栏会立即出现。我能够将问题简化为以下代码。

import SpriteKit

var overlayNode:SKNode?
var header = SKSpriteNode()
var scoreBar:SKSpriteNode?
var scaleX:CGFloat = 0.3

class GameScene: SKScene {

    override func didMove(to view: SKView) {

         let path = Bundle.main.path(forResource: "SceneOverlay", ofType: "sks")
         let overlay = SKReferenceNode(url: URL(fileURLWithPath: path!))

        self.addChild(overlay)

        overlayNode = overlay.children.first

        header = overlayNode!.childNode(withName: "header") as! SKSpriteNode

        scoreBar = SKSpriteNode(imageNamed: "redBar")
        scoreBar?.position = CGPoint(x: 0, y: 0)
        scoreBar?.zPosition = 10
        scoreBar?.anchorPoint = CGPoint(x: 0, y: 0.5)
        scoreBar?.xScale = 0
        header.addChild(scoreBar!)
    }


    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        scaleX += 0.1
        let scoreBarExpand = SKAction.scaleX(to: scaleX, duration: 0.8)

        scoreBar!.run(scoreBarExpand)
        print ("Expanding score bar to \(scaleX)")

    }

}

overlay SKS 文件就是这样的:

SKS Overlay Image

如果您在 iOS 11 模拟器或设备上运行此代码,然后点击屏幕,则每次点击时,得分栏都会出现并放大 10%。然而,你什么也看不到。然后,您可以在 Xcode 调试器中暂停和恢复应用程序,该栏将立即出现并展开。同样,此问题不会出现在 iOS 10 设备/模拟器上。

对这里发生的事情有什么想法吗?

提前致谢。

【问题讨论】:

  • 你取消暂停你的场景了吗?由于某种原因,它们现在开始处于暂停状态

标签: ios iphone xcode sprite-kit


【解决方案1】:

正如我在其他一些场景中所指出的,但它们都指向同一个问题。我发现 iOS11 和 SpriteKit 存在严重问题。过渡期间的游戏场景会自动暂停(但仅在 iOS11 中)。

Knight0fDragon 还指出,看起来对象在创建时而不是在过渡期间暂停。还是一样的结果。

转场后运行

myScene.isPaused = false 

应该可以解决问题,并且在iOS10上运行游戏时应该没有不良影响

【讨论】:

  • 现在默认情况下在创建时暂停,而不是通过过渡。我是在周末发现的。
  • 我认为所有SKNodes 在创建时都会暂停,因此当您取消暂停场景时,所有节点也将取消暂停(另一个他们永远不会修复的好“错误”,因为他们就是这样想要它按设计[无需费心记录此])
  • 很高兴知道它是在创作中,稍微更有意义。但仍然是一个无证的噩梦
  • 感谢您的快速回复。你是绝对正确的,我检查了头节点的状态,它确实是暂停的。当我放入断点然后恢复时,它会自动将标题的状态更改为不再暂停。很有意思。我还为此提交了一份错误报告,所以我很想知道苹果是否会回来。太糟糕了,这没有记录。我试图给你投票,但我没有足够的声誉。
  • 很高兴它帮助了@MikeL 您可以同时将其标记为正确,以便其他人知道答案有帮助,直到您获得 nesc。声誉
【解决方案2】:

我在我的 ObjC 项目中遇到了同样的问题。 Knight0fDragons 的回答对我没有直接作用,但它启发了我。

奇怪的是先暂停然后取消暂停对我有用。

    myScene.paused = YES;
    myScene.paused = NO;

希望这对某人有所帮助。

【讨论】:

  • 这也是我的解决方案(在 swift - iOS 14 中)。 Spritekit 的新手,断点(使用暂停/恢复)会影响它的工作方式,这对我来说是调试的噩梦。仍然不确定谷歌是如何让我来到这里的(经过两天的搜索和调试)为什么这对每个人来说都不是问题?人们是否不使用 sks 文件来定义其资产以供重用,而是在代码中设置资产?我有一个大约 10 个节点(手臂、腿、头......)的角色,所以这样做对我来说很有意义。
猜你喜欢
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
  • 2018-03-15
  • 1970-01-01
  • 2018-09-15
相关资源
最近更新 更多