为啥 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?