Swift 在展开之前设置的纹理值时发现为零

Swift 在展开之前设置的纹理值时发现为零,swift,sprite-kit,textures,skphysicsbody,Swift,Sprite Kit,Textures,Skphysicsbody,因此,我试图将一个SKSpritenode添加到我的场景级别2中,我想给它一个物理体,其纹理来自我上传到项目的“资源”文件夹中的图像。图像在那里,名称是正确的,但当启动应用程序时,我得到一个致命错误。在我添加最后一行代码之前,这个应用程序一直运行得很平稳,所以我不会出错 import UIKit import SpriteKit import GameplayKit class level2: SKScene { var entities = [GKEntity]() va

因此,我试图将一个SKSpritenode添加到我的场景级别2中,我想给它一个物理体,其纹理来自我上传到项目的“资源”文件夹中的图像。图像在那里,名称是正确的,但当启动应用程序时,我得到一个致命错误。在我添加最后一行代码之前,这个应用程序一直运行得很平稳,所以我不会出错

import UIKit
import SpriteKit 
import GameplayKit

class level2: SKScene {

    var entities = [GKEntity]()
    var graphs = [String : GKGraph]()

    var perno = SKSpriteNode(fileNamed: "perno")

    override func sceneDidLoad () {
        print ("view2 Loaded")

        self.perno  = self.childNode(withName: "perno") as? SKSpriteNode
        self.perno?.texture = SKTexture(imageNamed: "perno")
        self.perno?.size.width = self.perno!.size.width * 5

        self.perno!.physicsBody = SKPhysicsBody(texture: (perno?.texture)!, size: (perno?.texture?.size())!)



}
有什么提示吗


谢谢

您的可选处理方式确实不一致。有时,使用可选的强制转换和可选的链接只是为了在同一行中的同一变量上使用强制展开。您应该强制展开
SKSpriteNode(filename:“perno”)
的返回值,因为如果返回
nil
,则是程序员错误,应尽快捕获

您当前的问题似乎是您试图覆盖
sceneDidLoad
中的
perno

self.perno  = self.childNode(withName: "perno") as? SKSpriteNode
没有
childNode
添加到场景中,因此您只需将
perno
设置为
nil
,而不是使用
var perno=SKSpriteNode(文件名为:“perno”)
将其先前设置的值。只需从
sceneDidLoad
中删除该行,因为它没有任何意义,
perno
在初始化过程中已经加载,因为您为它指定了一个值

class Level2: SKScene {

    var entities = [GKEntity]()
    var graphs = [String : GKGraph]()

    let perno = SKSpriteNode(fileNamed: "perno")!

    override func sceneDidLoad () {
        print ("view2 Loaded")
        self.perno.texture = SKTexture(imageNamed: "perno")
        self.perno.size.width = self.perno.size.width * 5

        self.perno.physicsBody = SKPhysicsBody(texture: perno.texture!, size: perno.texture!.size())
    }

}
保护自己的更好方法是使用
guard
语句
guard
允许您安全地检查变量是否为非零,而无需嵌套代码

class Level2: SKScene {

    var entities = [GKEntity]()
    var graphs = [String : GKGraph]()

    let perno = SKSpriteNode(fileNamed: "perno")!

    override func sceneDidLoad () {
        print ("view2 Loaded")
        guard let texture = SKTexture(imageNamed: "perno")
        else{
            fatalError("Unable to find texture "perno")
        }
        self.perno.texture = texture
        self.perno.size.width = self.perno.size.width * 5

        self.perno.physicsBody = SKPhysicsBody(texture: texture, size: texture.size())
    }

}

正如您所看到的,我们没有过度地展开self.perno.texture,这意味着我们不小心使用?而不是一个!,关于代码崩溃的原因,我们有一个明确的错误。

您的可选处理方式确实不一致。有时,使用可选的强制转换和可选的链接只是为了在同一行中的同一变量上使用强制展开。您应该强制展开
SKSpriteNode(filename:“perno”)
的返回值,因为如果返回
nil
,则是程序员错误,应尽快捕获

您当前的问题似乎是您试图覆盖
sceneDidLoad
中的
perno

self.perno  = self.childNode(withName: "perno") as? SKSpriteNode
没有
childNode
添加到场景中,因此您只需将
perno
设置为
nil
,而不是使用
var perno=SKSpriteNode(文件名为:“perno”)
将其先前设置的值。只需从
sceneDidLoad
中删除该行,因为它没有任何意义,
perno
在初始化过程中已经加载,因为您为它指定了一个值

class Level2: SKScene {

    var entities = [GKEntity]()
    var graphs = [String : GKGraph]()

    let perno = SKSpriteNode(fileNamed: "perno")!

    override func sceneDidLoad () {
        print ("view2 Loaded")
        self.perno.texture = SKTexture(imageNamed: "perno")
        self.perno.size.width = self.perno.size.width * 5

        self.perno.physicsBody = SKPhysicsBody(texture: perno.texture!, size: perno.texture!.size())
    }

}
保护自己的更好方法是使用
guard
语句
guard
允许您安全地检查变量是否为非零,而无需嵌套代码

class Level2: SKScene {

    var entities = [GKEntity]()
    var graphs = [String : GKGraph]()

    let perno = SKSpriteNode(fileNamed: "perno")!

    override func sceneDidLoad () {
        print ("view2 Loaded")
        guard let texture = SKTexture(imageNamed: "perno")
        else{
            fatalError("Unable to find texture "perno")
        }
        self.perno.texture = texture
        self.perno.size.width = self.perno.size.width * 5

        self.perno.physicsBody = SKPhysicsBody(texture: texture, size: texture.size())
    }

}

正如您所看到的,我们没有过度地展开self.perno.texture,这意味着我们不小心使用?而不是一个!,关于代码崩溃的原因,我们有一个明确的错误。

您好,谢谢。我尝试过按照你的建议编辑代码,但是现在它崩溃了,说在我加载场景之前第一次声明perno时它发现了nil。在我的.sks文件中,我确实有一个名为perno的精灵,所以我假设Xcode会将它链接到我代码中的let语句?@JustABeginner
lt perno=SKSpriteNode(文件名为:“perno”)
perno.sks
加载节点是否已将该文件添加到项目中?如果它崩溃,则说明您的项目文件结构不正确。我想对此进行扩展,这是学习如何使用
guard
语句的一个很好的场景,谢谢。我尝试过按照你的建议编辑代码,但是现在它崩溃了,说在我加载场景之前第一次声明perno时它发现了nil。在我的.sks文件中,我确实有一个名为perno的精灵,所以我假设Xcode会将它链接到我代码中的let语句?@JustABeginner
lt perno=SKSpriteNode(文件名为:“perno”)
perno.sks
加载节点是否已将该文件添加到项目中?如果它崩溃,则说明您的项目文件结构不正确。我想对此进行扩展,这是学习如何使用
guard
语句的一个很好的场景