2016-07-04 10 views
1

Есть ли способ объединить/кешировать SKReferenceNodes в SpriteKit с помощью Swift?Swift/SpriteKit - Любой способ объединения/кэширования SKReferenceNodes?

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

На данный момент я делаю это, как этот

создать убедить Init метод SKReferenceNodes инициализировать их с URL. Я делаю это, потому что есть некоторая ошибка, вызывающая SKReferenceNodes по имени файла напрямую (https://forums.developer.apple.com/thread/44090). Использование такого расширения делает код немного чище.

extension SKReferenceNode { 

convenience init(roomName: String) { 
    let path: String 
    if let validPath = NSBundle.mainBundle().pathForResource(roomName, ofType: "sks") { 
     path = validPath 
    } else { 
     path = NSBundle.mainBundle().pathForResource("RoomTemplate", ofType: "sks")! // use empty roomTemplate as backup so force unwrap 
    } 

    self.init(URL: NSURL(fileURLWithPath: path)) 
} 

}

и чем в моих сценах я могу создать их и добавить их как так (примерно каждые 10 секунд)

let room = SKReferenceNode(roomName: "Room1") // will cause lag without GCD 
room.position = ... 
addChild(room) 

Это работает нормально, но я получаю некоторое отставание/заикания при их создании. Поэтому я использую GCD, чтобы уменьшить это, чтобы в принципе не заикаться. Он работает хорошо, но мне интересно, могу ли я предварительно загрузить все файлы .sks.

Я попытался использовать массивы, чтобы сделать это, но я получаю сбои, и он просто не работает (я также получаю сообщение, уже добавляющее узел с родителем).

Я пытался поджать их, как это в приложение запуска

let allRooms = [SKReferenceNode]() 

for i in 0...3 { 
    let room = SKReferenceNode(roomName: "Room\(i)") 
    allRooms.append(room) 
} 

и чем использовать массив, когда мне нужно тоже. Однако это не работает, и я получаю сбой при попытке использовать такой код

let room = allRooms[0] 
room.position = 
addChild(room) // causes error/crash -> node already has parent 

Кто-нибудь сделал что-то подобное? Есть ли другой способ я могу объединить/кешировать эти ссылочные узлы ?. Я что-то пропустил?

ответ

1

Я просто понял это, я был просто идиотом.

Использование таких массивов, как я хотел, в порядке, проблема, с которой я столкнулся, была следующая.

Когда игра сцены первой загрузке я добавляю 3 комнаты, но при тестировании с массивами я продолжал добавлять один и тот же номер

let room = allRooms[0] 

вместо использования randomiser. Это, очевидно, означало, что я добавлял один и тот же экземпляр несколько раз, отсюда и авария.

С рандомизатором, который не повторяет одну и ту же комнату, этого не происходит.

Кроме того, я не забудьте снять комнату со сцены, когда мне это больше не нужно. У меня есть узел в комнатах (roomRemover), который запускает метод удаления/создания новой комнаты, когда он вступает в контакт с игроком. Это будет код в DidBeginContact.

guard let roomToRemove = secondBody?.node.parent?.parent?.parent?.parent else { return } 
// secondBody is the roomRemover node which is a child of the SKReferenceNode. 
// If I want to remove the whole SKReferenceNode I need to add .parent 4 times. 
// Not exactly sure why 4 times but it works 

for room in allRooms { 
    if room == roomToRemove { 
     room.removeFromParent() 
    } 
} 
loadRandomRoom() 

Надеюсь, что это поможет кому-то, кто пытается сделать то же самое.

1

Говоря о SKReferenceNode преднагрузки, я считаю, что политика, которым необходимо следовать, чтобы загрузить объект, найти какие они есть, и использовать официальные методы предзагрузку имеющиеся в Sprite-Kit:

Чтобы избежать такого рода ошибок, вы должны создать отдельные экземпляры узлов.

Попробуйте сделать это:

let room = allRooms[0] 
room.position = ... 
room.removeFromParent() 
addChild(room) 
+0

Эй, большое спасибо за ваш ответ. Я только что разобрался в своих проблемах, теперь я только что написал ответ. Еще раз спасибо за ваши усилия. – crashoverride777

+0

Добро пожаловать, спасибо вам, чтобы поделиться своим опытом :) –

+0

Еще раз спасибо за вашу помощь. – crashoverride777

 Смежные вопросы

  • Нет связанных вопросов^_^