Добавление спрайта в сцены, вызывающие EXC_BAD_ACCESS - PullRequest
0 голосов
/ 12 октября 2018

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

Если я где-то неясно, пожалуйста, дайте мне знать.

...