2015-10-23 3 views
0

У меня есть класс под названием Bird, то есть SKSpriteNode. У меня есть инициализация, но я не могу понять, как установить физический метод и другие его свойства в том же классе, а не в классе GameScene.Определить физикуBody для SKSpriteNode в отдельном подклассе SKSpriteNode - Swift2

класс Bird:

import SpriteKit 

class Bird: SKSpriteNode { 

    init() { 
     let texture = SKTexture(imageNamed: "birdy") 
     let size = texture.size() 

     super.init(texture: texture, color: UIColor.clearColor(), size: CGSizeMake(size.width/4, size.height/4)) 
     } 

     required init?(coder aDecoder: NSCoder) { 
      fatalError("init(coder:) has not been implemented") 
     } 
    } 

Функция для установки свойств птицы в GameScene:

var birdSprite: Bird! 

func setupBird() { 
    birdSprite = Bird() 
    birdSprite.position = CGPointMake(size.width*0.5, size.height*0.2) 
    birdSprite.zPosition = Layer.Bird.rawValue 
    self.addChild(birdSprite) 

    birdSprite.physicsBody = SKPhysicsBody(circleOfRadius: birdSprite.size.width/2) 
    birdSprite.physicsBody?.categoryBitMask = PhysicsCategory.Bird 
    birdSprite.physicsBody?.collisionBitMask = PhysicsCategory.None 
    birdSprite.physicsBody?.contactTestBitMask = PhysicsCategory.Desk 
    birdSprite.physicsBody?.allowsRotation = false 
    birdSprite.physicsBody?.restitution = 0 
    birdSprite.physicsBody?.usesPreciseCollisionDetection = true 
} 

Я попытался установить его физику тела, определив его в классе птиц, с self.physicsBody = ... но это дало мне ошибку, а также установило ее так же внутри функции init, поэтому я не включил ее здесь в код.

Причина, по которой я хочу сделать это в отдельном классе, заключается в том, что я хотел бы научиться писать хорошо организованный код, чтобы код был более читабельным и самоочевидным. Но я более или менее новичок в Swift и программирование в целом, поэтому отсутствие опыта и знаний дает мне некоторые проблемы.

Любая помощь или предложение приветствуются!

ответ

2

Вы пытались установить эти свойства после вызова super.init()?

Поскольку свойства, которые вы хотите установить которые из суперкласса, то они могут быть запрограммированы только после этого вызова, как в:

init() { 
    let texture = SKTexture(imageNamed: "birdy") 
    let size = texture.size() 

    super.init(texture: texture, color: UIColor.clearColor(), size: CGSizeMake(size.width/4, size.height/4)) 

    self.physicsBody = SKPhysicsBody(circleOfRadius: self.size.width/2) 
} 

Я не знаю точно, что вы сделали первый в init(), но, возможно, это так.

+0

Это работает! Как вы предположили, он не работал, потому что я настраивал его перед инициализацией, спасибо! – Larisa