распаковка SKPhysicsBody не работает

В моем проекте я создаю новые узлы с помощью класса RocketMaker. Внутри этого класса у меня есть функция с именем applyRecurringForce()...

func applyRecurringForce() {
    var thrust: CGVector = CGVectorMake(100, 100)
    physicsBody!.applyForce(thrust)
}

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

override func update(currentTime: NSTimeInterval) {
    /* Called before each frame is rendered */
    for rocketNode in rocketShips.children {
        println("physicsBody: \(rocketNode.physicsBody.description)")
        rocketNode.physicsBody.applyRecurringForce()
    }
}

Начиная с приведенного выше кода, я получаю две ошибки: одну для println и одну для вызова applyRecurringForce().

Подход 1: без принудительной распаковки...
1) Ошибка println: «Значение необязательного типа 'SKPhysiceBody' не развернуто; вы хотели использовать '!' или '?'?" и предлагает принудительно развернуть
2) Вызов возвращает "Невозможно вызвать 'applyRecurringForce' без аргументов"

Подход 2: я добавляю "!" следуя предложенному решению...
1) Ошибка println такая же, как и для предыдущего подхода": "Значение необязательного типа 'SKPhysiceBody' не развернуто; Вы хотели использовать '!' или '?'?" и снова предлагает принудительно развернуть
2) Вызов возвращает ту же ошибку, что и раньше: "Невозможно вызвать 'applyRecurringForce' без аргументов"

Подход 3. Итак, я следую цепочке, используя "physicsBody!!" в обеих строках в функции переопределения. На этот раз одна из двух ошибок устранена...
1) Ошибка println устранена
2) Вызов возвращает "'SKPhysicsBody не имеет члена с именем 'applyRecurringForce'"

Если я закомментирую вызов, я получу

physicsNodeName: тип: репрезентативный объект: [название: 'ракета1' позиция: {56, 294} аккумулированный кадр: {{16.849998474121094, 280.20001220703125}, {78.300003051757812, 27.5999755859375}}]

У кого-нибудь есть идея, что случилось ?? Мне эта двойная развертка кажется очень странной.


person Shane O'Seasnain    schedule 20.06.2015    source источник


Ответы (1)


Ну, ваш метод applyRecurringForce объявлен в вашем пользовательском классе узла (RocketMaker), а не в классе SKPhysicsBody. Итак, вам нужно изменить внутреннюю часть вашего цикла for на это:

println("physicsBody: \(rocketNode.physicsBody!.description)")
rocketNode.applyRecurringForce()

Также я не совсем уверен, что такое rocketShips. Изначально я думал, что это массив, но, учитывая, что вы обращаетесь к свойству children, я предполагаю, что это какой-то SKNode. Обычно вы не хотите называть один узел во множественном числе.

Предполагая, что rocketShips является узлом, вам нужно будет привести его дочерние элементы к вашему пользовательскому классу узла, потому что по умолчанию children является массивом AnyObject (поэтому вы видите двойное развертывание). Полное решение смотрите ниже. Обратите внимание, что я использую весь массив children. Если ваш массив содержит смесь узлов RocketMaster и других узлов, вам нужно будет привести каждый дочерний элемент отдельно.

import SpriteKit
class GameScene: SKScene {
    var rocketShips: SKNode! //var rocketShips: [RocketMaster] = []
    override func update(currentTime: NSTimeInterval) {
        /* Called before each frame is rendered */
        for rocketNode in rocketShips.children as! [RocketMaster] {
            println("physicsBody: \(rocketNode.physicsBody!.description)")
            rocketNode.applyRecurringForce()
        }
    }
}

class RocketMaster: SKNode {
    func applyRecurringForce() {
        var thrust: CGVector = CGVectorMake(100, 100)
        physicsBody!.applyForce(thrust)
    }
}
person Epic Byte    schedule 20.06.2015
comment
Спасибо огромное! Вы правы, RocketShips — это SKNode. Его дочерние элементы создаются в пользовательском классе узлов (разноцветные уровни ракет). Я также пробовал RocketNode.applyRecurringForce(), но был заблокирован ошибкой AnyObject не имеет члена с именем «applyRecurringForce()». Приведение детей RocketShips к RocketMaster решило проблему! - person Shane O'Seasnain; 20.06.2015
comment
@ShaneO'Seasnain Пожалуйста, отметьте мой ответ как принятый, если вы считаете, что ваша проблема решена. Удачи в игре. - person Epic Byte; 20.06.2015