为啥 SKSpriteNode(fileNamed:) 使用 Swift 在 iOS 中生成 nil?

Posted

技术标签:

【中文标题】为啥 SKSpriteNode(fileNamed:) 使用 Swift 在 iOS 中生成 nil?【英文标题】:Why is SKSpriteNode(fileNamed:) generating nil in iOS using Swift?为什么 SKSpriteNode(fileNamed:) 使用 Swift 在 iOS 中生成 nil? 【发布时间】:2019-05-11 22:09:10 【问题描述】:

为什么 SKSpriteNode 的 init(fileNamed:) 会生成 nil?

我已经尝试了以下代码。我只显示与问题相关的代码:

let road = SKSpriteNode(fileNamed: "road.png")

override func didMove(to view: SKView) 

    print("road", road as Any) // road nil
    if let road = self.road 
        road.position = view.center
        road.physicsBody = SKPhysicsBody(rectangleOf: road.size)
        print(road.physicsBody?.isDynamic as Any, "!")
        road.physicsBody?.pinned = true
        addChild(road)
    


无论图像文件是常规 png 还是动画 png 文件,我都会得到 nil。

【问题讨论】:

您的项目中添加了"road.png" 吗?在 File Inspector 中,确保选中您应用的 Target Membership @vacawama 两个问题都是。 不要使用“.png” @Knight0fDragon 我试过了。我得到了同样的结果。 1,这很傻,2,这意味着你需要告诉 spritekit 文件在你的包中的位置。把它当作资产就行了,大小没有区别 【参考方案1】:

您应该使用SKSpriteNode(imageNamed:) 而不是SKSpriteNode(fileNamed:)

SKSpriteNode(imageNamed:) - 为您加载图像作为纹理并创建一个节点。

SKSpriteNode(fileNamed:) 实际上是来自 SKNode 的 init 方法,正如官方文档中所说:

初始化?(文件名:字符串) 通过从游戏的主包中加载存档文件来创建一个新节点。

所以有两种不同的方法(构造函数),来自两个不同的类,即使一个继承自另一个,也不应该混淆。

【讨论】:

以上是关于为啥 SKSpriteNode(fileNamed:) 使用 Swift 在 iOS 中生成 nil?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 SKSpriteNode 没有以图像的默认分辨率显示?

为啥当我将 SKSpriteNode 与图像一起使用时它不会反弹,但当我使用 SKShapeNode 时它确实有效?

为啥 SKSpriteNode node.frame.size.width 小于 node.size.width?

向 SKSpriteNode(或 SKScene)添加背景模糊

为啥我的精灵没有用图像初始化?

为啥精灵套件中的坐标系会翻转,我可以全局更改吗?