2015-06-20 2 views
0

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

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“без аргументов»

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

Approach3: Так что я следую за цепь, используя «physicalBody !!» в обеих строках в функции переопределения. На этот раз одна из двух ошибок удалена ...
1) Ошибка печати не удалась
2) Вызов возвращает «SKPhysicsBody» не имеет член под названием 'applyRecurringForce' '

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

physicsNodeName: Тип: representedObject: [имя: положение 'rocket1': {56, 294} accumulatedFrame: {{16,849998474121094, +280,20001220703125}, {78,300003051757812, +27,5999755859375}}]

Кто-нибудь есть идея что происходит?? Эта двойная развертка выглядит очень странно для меня.

ответ

0

Хорошо, ваш метод applyRecurringForce объявлен в вашем пользовательском классе узлов (RocketMaker), а не в классе SKPhysicsBody. Таким образом, вы должны изменить внутри вашего для петли к этому:

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) 
    } 
} 
+0

Спасибо! Вы правы, rocketShips - это SKNode. Его дочерние элементы создаются в классе пользовательских узлов (разноцветные уровни ракеты). Я также пробовал rocketNode.applyRecurringForce(), но был заблокирован ошибкой «AnyObject не имеет члена с именем« applyRecurringForce() ». Кастинг ракеты Sears для детей в RocketMaster решил проблему! –

+0

@ ShaneO'Seasnain Пожалуйста, отметьте мой ответ как принятый, если вы чувствуете, что ваша проблема решена. Удачи вам в вашей игре. –