транслятор:Debug почему SKScene инициализации (fileNamed :) возвращает нильполугруппы
Выпуск:SKScene
подкласса init(fileNamed:)
возвращает nil
Причина: Файл .sks
не существует в момент второй инициализации вызов. Проблема каким-то образом связана с поведением И/ИЛИ поведения ODR.
ОПИСАНИЕ:
Игра построена с SpriteKit
. Мой SKScene
Подкласс init(fileNamed:)
возвращает nil
. Я пытаюсь понять, почему? и как?" для отладки этой проблемы.
Мой код для инициализации SKScene
подкласса:
/// the hierarchy: SKScene -> TBTBaseScene -> TBTLevelScene
let sceneType: TBTBaseScene.Type = TBTLevelScene.self
let fileName = "Level1"
let scene = sceneType.init(fileNamed: fileName)
Мало что отметить:
- Этот код работает в какой-то момент во время выполнения, но не в другом.
- Когда цель построена через Xcode, перейдите к Products -> AppName.app, щелкните правой кнопкой мыши, «Показать в Finder», есть NO
Level1.sks
. Возможно, это хорошо, потому что приложение использует ODR иLevel1.sks
отмечено «Level1» тег, даже если он находится в начальной установке метки - Когда точка останова устанавливаются на
let sceneType:...
линии, я мог бы легко создать другие сцены игр через соответствующие подклассы и имена файлов, ноexpression TBTLevelScene(fileName:"Level1")
возвращаетnil
. - Я попытался проверить, есть ли
Level1.sks
в главном комплекте, но код ниже ВСЕГДА говорит «ФАЙЛ НЕ ДОСТУПНО» для всех сцен, поэтому подход кажется неправильным. - Архитектура игры для загрузки сцены приводится в движение от DemoBots Sample Code. Аналогичный подход можно найти в
LoadSceneOperation.swift
. Инициализация там, однако, отлично работает во всех случаях.
код я использую, чтобы проверить "Level1" или "Level1.sks" существуют, на основе this answer:
let path = NSBundle.mainBundle().bundlePath
let url = NSURL(fileURLWithPath: path)
let filePath = url.URLByAppendingPathComponent(fileName).absoluteString
let fileManager = NSFileManager.defaultManager()
if fileManager.fileExistsAtPath(filePath) {
print("FILE AVAILABLE")
} else {
print("FILE NOT AVAILABLE")
}
UPDATE:
подход для проверки файлов обеспечивается Michael Dautermann делает работу и доказывает причину: Level1.sks
делает не есть во время второй попытки загрузить его.
Файл с добавлением Level1.sks
в проект добавлен в раздел «Ресурсы копирования ресурсов» и имеет ODR-метку «Level1». Тег находится в Исходная установка Теги группа, предварительно выбранная.
Существует определенная ошибка в реализации ORD, которая предоставляет ресурс (Level1.sks
), когда он не нужен, и не загружает его обратно в то время, когда это необходимо.Я продолжу двигаться, чтобы понять это. (Похоже, SO-сообщество не имеет к этому отношения)
Подход к проверке существования файла работает. и это показывает, что «Level1.sks» недоступен * в момент сбоя приложения. Тем не менее, в области «Копирование ресурсов Bundle» есть * Level1.sks. –
должна быть причина, по которой файл не копируется в встроенное приложение. В журнале построения ничего полезного? (используйте «показать все сообщения») –
см. мое обновление. Вы сократили код, помогли сузить дело. Благодарю. @Michael Dautermann –