Найдено ноль при развертывании значения текстуры, которое я ранее установил - PullRequest
0 голосов
/ 02 октября 2018

, поэтому я пытаюсь добавить SKSpritenode в свою сцену level2, и я хочу дать ему физическое тело с текстурой, которая получена из изображения, которое я загрузил в папку ресурсов моего проекта.изображение там и имя правильное, но при запуске приложения я получаю фатальную ошибку.Я не понимаю, в чем дело, так как приложение работало гладко, пока я не добавил последнюю строку кода.

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())!)



}

есть подсказки?

Спасибо!

1 Ответ

0 голосов
/ 02 октября 2018

Ваша необязательная обработка действительно противоречива.Иногда вы используете необязательное приведение и необязательное сцепление, чтобы затем использовать принудительное развертывание для одной и той же переменной в той же строке.Вы должны принудительно развернуть возвращаемое значение SKSpriteNode(fileNamed: "perno"), так как, если оно возвращает nil, это ошибка программиста и должна быть перехвачена как можно скорее.

Ваша непосредственная проблема заключается в том, что вы пытаетесь перезаписать perno вsceneDidLoad:

self.perno  = self.childNode(withName: "perno") as? SKSpriteNode

К вашей сцене не добавлено childNode, поэтому вы просто устанавливаете perno на nil вместо его ранее установленного значения, используя var perno = SKSpriteNode(fileNamed: "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 позволяет безопасно проверять, является ли переменная не равной nil, без необходимости вложения вашего кода.

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, что означает, что будет меньшешансы для нас случайно использовать?вместо!, и у нас есть четкая ошибка, объясняющая причину сбоя нашего кода.

...