2016-03-31 5 views
2

транслятор: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) 

Мало что отметить:

  1. Этот код работает в какой-то момент во время выполнения, но не в другом.
  2. Когда цель построена через Xcode, перейдите к Products -> AppName.app, щелкните правой кнопкой мыши, «Показать в Finder», есть NO Level1.sks. Возможно, это хорошо, потому что приложение использует ODR и Level1.sks отмечено «Level1» тег, даже если он находится в начальной установке метки
  3. Когда точка останова устанавливаются на let sceneType:... линии, я мог бы легко создать другие сцены игр через соответствующие подклассы и имена файлов, но expression TBTLevelScene(fileName:"Level1") возвращает nil.
  4. Я попытался проверить, есть ли Level1.sks в главном комплекте, но код ниже ВСЕГДА говорит «ФАЙЛ НЕ ДОСТУПНО» для всех сцен, поэтому подход кажется неправильным.
  5. Архитектура игры для загрузки сцены приводится в движение от 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-сообщество не имеет к этому отношения)

ответ

4

Здесь кое-что происходит, но в конечном итоге происходит то, что кажется, что ваш файл «Level1» не заканчивается в встроенном приложении ,

1)

Ваш проверить существование файла кода там перемешивает пути файл URL, и файл слишком много. Измените свой код, чтобы выглядеть следующим образом:

// if nodePath is nil, then it's not found in the bundle 
if let nodePath = NSBundle.mainBundle().pathForResource("Level1", ofType: "sks") 
{ 
    print("FILE AVAILABLE") 
} else { 
    print("FILE NOT AVAILABLE") 
} 

2)

Убедитесь, что файл вашего .sks копируется в ваше построенном приложение.

Открыть раздел «Построить фазы» цели и click on the "Copy Bundle Resources" area. Убедитесь, что ваш файл .sks включен.

+0

Подход к проверке существования файла работает. и это показывает, что «Level1.sks» недоступен * в момент сбоя приложения. Тем не менее, в области «Копирование ресурсов Bundle» есть * Level1.sks. –

+0

должна быть причина, по которой файл не копируется в встроенное приложение. В журнале построения ничего полезного? (используйте «показать все сообщения») –

+0

см. мое обновление. Вы сократили код, помогли сузить дело. Благодарю. @Michael Dautermann –