Так что я не мог найти хороший ответ, который подходит для моей проблемы.Я создаю игру SpriteKit на iOS.Я просто собираюсь дать вам, ребята, краткий обзор моей установки, а затем перейти к проблеме.Я думаю, что это лучший способ объяснить это.
Настройка:
В основном в моем методе didMove (для просмотра :) я вызываю две вспомогательные функции: setupNodes () и setupLevel ().Эти функции выполняют загрузку различных сцен и узлов SKSprite в память, а затем добавляют их в сцену.Вот код, который я использую для этого:
func setupNodes(){
doubleVent = (loadForegroundOverlayTemplate("DoubleVent").copy() as! SKSpriteNode)
}
func loadForegroundOverlayTemplate(_ fileName: String) -> SKSpriteNode{
let overlayScene = SKScene(fileNamed: fileName)!
let overlayTemplate = overlayScene.childNode(withName: "ForegroundOverlay")!.copy() as! SKSpriteNode
return overlayTemplate
}
Теперь в нем хранится сцена, являющаяся дочерним элементом SKNode с именем "ForegroundOverlay".Затем я передаю это в функцию с именем "createForegroundOverlay ()" следующим образом:
let overlaySprite = doubleVent
createForegroundOverlay(doubleVent)
, а затем "createForegroundOverlay" добавляет SKSpriteNode, сохраненный в doubleVent, в сцену следующим образом:
func createForegroundOverlay(_ overlayTemplate: SKSpriteNode) {
let foregroundOverlay = overlayTemplate.copy() as? SKSpriteNode
lastOverlayPosition.x = lastOverlayPosition.x + (lastOverlayWidth + ((foregroundOverlay?.size.width)!)/2)
lastOverlayWidth = (foregroundOverlay?.size.width)!/2.0
foregroundOverlay?.position = lastOverlayPosition
//TESTING PURPOSES
if TESTING_NODE_POS{
print("The last overlay position x:\(lastOverlayPosition.x), y:\(lastOverlayPosition.y)")
print("The last overlay width is \(lastOverlayWidth)")
print("Adding a foreground overlay \(count)")
count += 1
}
//TESTING PURPOSES
if TESTING_BOX_OUTLINE {
let foregroundPos = foregroundOverlay?.position
let boxLocation = foregroundOverlay?.childNode(withName: "Box1")?.position
if boxLocation != nil {
print("The location of the box \(String(describing: boxLocation))")
print("The foregroundLocation is \(String(describing: foregroundPos))")
print("last overlay position is \(lastOverlayPosition)")
}
}
//add the foreground overlay as a child of the foreground node
fgNode.addChild(foregroundOverlay!)
}
переменные для позиционирования - lastOverlayPosition, lastOverlayWidth и т. д. - это просто свойства моего класса GameScene, используемые для определения того, где и когда нужно добавить переданное наложение.
fgNode - это узел, который я сохранил из моегоФайл GameScene.sks выглядит так:
let worldNode = self.childNode(withName: "World")!
bgNode = worldNode.childNode(withName: "Background")!
bgCityNode = worldNode.childNode(withName: "BackgroundCity")
cityBGOverlayTemplate = (bgCityNode.childNode(withName: "Overlay")!.copy() as! SKNode)
cityOverlayWidth = bgCityNode.calculateAccumulatedFrame().width
backgroundOverlayTemplate = (bgNode.childNode(withName: "Overlay")!.copy() as! SKNode)
backgroundOverlayWidth = backgroundOverlayTemplate.calculateAccumulatedFrame().width
fgNode = worldNode.childNode(withName: "Foreground")!
Это также было сделано в моем методе setupNodes ().
Проблема:
Так что, возможно, некоторые из вас, ребята, ужевидел проблему, но проблема в том, что когда я запускаю свою игру, она падает, и я получаю сообщение:
"Тема 1: EXC_BAD_ACCESS: (code = 1, address = 0x78)"
Это одно и то же сообщение каждый раз, когда происходит сбой.Я думаю, что я понимаю, что говорит ошибка.В основном есть указатель, указывающий на какое-то место в памяти (0x78), в котором ничего нет.Поэтому разыменование этого указателя, очевидно, вызывает ошибку.Вот где я запутался ... Это происходит только в 50% случаев.когда я запускаю и собираю проект, он каждый раз успешно собирается, а затем вылетает с ошибкой в 50% случаев.Во-вторых, это происходит в самом начале.Это странно для меня, потому что как часть памяти уже может быть освобождена, что приводит к плохому указателю в самом начале игры.Кроме того, если сбой не происходит при запуске, то сбой никогда не происходит, за исключением случаев, когда я перезагружаю сцену после отображения игры поверх сцены, что в основном совпадает с повторным запуском игры.
Со временемЯ сузил проблему до одной строки кода:
fgNode.addChild(foregroundOverlay!)
, если я закомментирую эту строку, сбой никогда не произойдет (я пытался собрать и запустить 50 раз).Проблема должна быть связана с переменной foregroundOverlay, которая была настроена с использованием кода в разделе настройки этого обсуждения.Так что я понятия не имею, как это исправить ... Любые идеи ??
PS Возможно, стоит также отметить, что добавление ребенка на сцену таким образом только заметно стало проблемой, когда я обновился до xCode 10.0.и что я подумывал об использовании зомби, но я не думаю, что это помогло бы, потому что сбой происходит только при запуске игры.
Если я где-то неясно, пожалуйста, дайте мне знать.