2016-03-13 3 views
1

Я делаю игру, в которой объекты появляются на карте в определенном месте, и у меня есть несколько функций для разных объектов, и мне нужна ссылка, поэтому я помещаю свой код за пределы функции расширения сферы его применения, но теперь я получаю сообщение об ошибке:тип кадра экземпляра, когда нет функции error

Instance type 'frame' cannot be used on type 'Levelunit' 

Если я положил его обратно в функцию оно совершенно нормально, но это, кажется, есть проблема, когда я положил его вне функции. Вот мой код:

let yAxisSpawnLocations: [CGFloat] = [0] 
let xAxisSpawnLocations: [CGFloat] = { 

    var spawnLocations:[CGFloat] = [] //Create 5 possible spawn locations 
    let numberOfNodes = 5 

    for i in 0...numberOfNodes - 1 { 

     var xPosition = (frame.maxX)/CGFloat((numberOfNodes - 1)) * CGFloat(i) 

     xPosition += thePlayer.size.width/2 

     xPosition -= frame.maxX/1.6 
     spawnLocations.append(xPosition) 

    } 

    return spawnLocations 

}() 

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

BTW, LevelUnit - это имя моего класса.

+0

Если вы предоставить более подробную информацию о классе Levelunit я мог бы прокомментировать больше о, если это хорошая идея, чтобы отменить его инициализатор и инициализируйте свойство 'xSwnwnLocation'. Я предполагаю, что это подкласс «SKScene», и вы инициализируете его с помощью инициализатора удобства fileNamed, правильно? Но в любом случае, проверьте мой ответ. Он должен работать. – Whirlwind

ответ

1

Вы пытаетесь использовать self, прежде чем Levelunit будет полностью инициализирован. Например, это единственное место, где вы используете self неявно:

var xPosition = (frame.maxX)/CGFloat((numberOfNodes - 1)) * CGFloat(i) 

это то же самое, как:

var xPosition = (self.frame.maxX)/CGFloat((numberOfNodes - 1)) * CGFloat(i) 

Итак, что вы можете сделать, это инициализировать это свойство в Levelunit инициализаторе (который я пропустит, если вы не хотите танцевать с правилами автоматического наследования инициализатора), или инициализировать его в didMoveToView, который будет работать нормально. Если я не ошибаюсь, Levelunit, вероятно, является подклассом SKScene, верно? Если это так, просто это сделать:

//Define a property of Levelunit like this 

var xAxisSpawnLocations:[CGFloat] = [] 

Тогда просто инициализировать его внутри didMoveToView:

let numberOfNodes = 5 

for i in 0...numberOfNodes - 1 { 

    var xPosition = (self.frame.maxX)/CGFloat((numberOfNodes - 1)) * CGFloat(i) 

    xPosition += thePlayer.size.width/2 
    xPosition -= frame.maxX/1.6 
    xAxisSpawnLocations.append(xPosition) 

} 
+0

спасибо, что сработало, мне было интересно, можете ли вы помочь мне с этим вопросом? http://stackoverflow.com/questions/36434190/taking-an-array-option-out-for-one-cycle – Astrum

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