首页 > 解决方案 > 如何以正确的顺序创建多个 SKShapeNode?

问题描述

多个 SKShapeNode 创建如下:

for i in 1...20 {
        let waitAct = SKAction.wait(forDuration: delay)
        self.run(waitAct) {
                let disc = SKShapeNode(rectOf: CGSize(width: width, height: height), cornerRadius: height/2)
                disc.position = CGPoint(x: self.frame.midX, y: self.frame.maxY)
                disc.fillColor = self.discColors[i]
                disc.strokeColor = .clear
                disc.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: width, height: height))
                disc.physicsBody?.affectedByGravity = true
                disc.physicsBody?.density = 0.5 
                disc.physicsBody?.mass = 0.2
                disc.physicsBody?.friction = 1.0
                disc.physicsBody?.restitution = 0
                disc.physicsBody?.isDynamic = true
                disc.physicsBody?.allowsRotation = false
                disc.name = "\(i)"
                self.addChild(disc)

                let label = SKLabelNode(text: "\(i)")
                label.fontColor = .white
                label.fontName = "Arial Rounded MT Bold"
                label.fontSize = fontSize
                label.verticalAlignmentMode = .center
                disc.addChild(label)

                print(i)
        }    
        delay += 0.2
}

所有光盘都在屏幕顶部创建,然后自动下拉,所有光盘垂直堆叠。

这里有两个问题:

  1. 光盘应按 1 到 20 的顺序堆叠。打印时,它们是正确的。但是当检查labelNode文本时,它们可以在真实设备上运行,但是对于几张光盘,有时在模拟器上会失败(尤其是在iPad Pro,iPhone 11 Pro等大屏幕设备上开始运行时),我认为这是一个问题计算机速度:-(。为了安全起见,现在我设置了“延迟+= 0.2”。我认为这也是动画问题的下降。我怎样才能确保它们可以按顺序放置?(尽可能保持短暂的延迟)

  2. 当圆盘下落完成并堆叠起来时,它们会继续非常轻微且持续地弹跳。更多的光盘,更多的弹跳。我认为这是一个问题disc.physicsBody?.affectedByGravity = true,但必须启用此功能以便以后移动。如何让他们保持静止?

谢谢。

=== 已编辑 ===

问题 2 的解决方案:圆盘下方有一层,它们的恢复必须都设置为 0。

标签: iosswiftskspritenodesksceneskshapenode

解决方案


解决SpriteKit模拟器上的性能问题,我建议查看此页面:

开发在模拟器中运行的 Metal 应用程序

值得注意的是,本节:

模拟器不会尝试从您正在模拟的 iOS 或 tvOS 设备中精确模拟 GPU。例如,如果您正在模拟 iPhone XS,模拟器不会尝试模拟 A12 GPU 的功能。相反,模拟器会翻译您进行的任何调用并将它们定向到主机 Mac 上选定的 GPU。

如果启用以下选项,您可能会看到您的模拟器低于 60.0 fps,具体取决于您的主机性能:

skView.showsFPS = true

但是,将其设置为true并在硬件上使用它应该始终提供 60.0 fps。

最终,当开发任何基于金属的东西时,例如 SpriteKit,你无法保证模拟器的性能。毕竟是模拟器,不是模拟器

最后引用苹果的话:

模拟器最适合用于快速原型化和测试应用程序行为,以及开发应用程序的基本渲染或计算能力。

当然,您可以想出一些技巧来解决这些限制,但是您将不会测试已发布的代码(当针对发布而不是调试进行优化时,这些代码将再次以不同的方式执行)。


推荐阅读