2017-01-26 5 views
1

Я использую класс суб здесь под названием Enemy, наследуемый от SKShapeNode, проблема здесь, когда я проверить столкновение между bullet и enemy и я хватаю противника health это говорит found nil while unwrapping.Зачем использовать подкласс SKShapenode?

вот мой код:

private func drawEnemy() { 
     let (color, edge) = randomColorandEdge() 
     let nextEnemyPosition = determineNextEnemyPosition(edge: Int(edge)) 
     let enemyPosition = spawnAtRandomPosition(edge: nextEnemyPosition) 
     let enemyCircle = Enemy(scene: self, color: color, radius: globalRadius, position: enemyPosition) 
     let enemy = enemyCircle.drawEnemy() 
     world.addChild(enemy) 
     numberOfEnemies += 1 
     enemy.name = String(numberOfEnemies) 
     runToCenter(enemy: enemy) 
    } 

func didBegin(_ contact: SKPhysicsContact) { 
if (contact.bodyB.categoryBitMask == bodyType.bullet.rawValue) && (contact.bodyA.categoryBitMask == bodyType.enemy.rawValue) { 
      let hitter = contact.bodyB.node as? SKShapeNode 
      let enemy = contact.bodyA.node as? Enemy 
      hitter?.removeFromParent() 
      let health = enemy?.getHealth() 
      if health! > 0 { 
       enemy?.setHealth(amount: health! - 1) 
      }else { 
       enemy?.removeFromParent() 
      } 
     } 
    } 

и вот мой Enemy класс:

class Enemy: SKShapeNode { 

    private var health: Int = 5 
    private var color: SKColor! 
    private var radius: CGFloat! 
    private var s: SKScene! 
    private var pos: CGPoint! 
    private var enemy: SKShapeNode! 

    init(scene: SKScene, color: SKColor, radius: CGFloat, position: CGPoint) { 
     self.color = color 
     self.radius = radius 
     self.health = 5 
     self.s = scene 
     self.pos = position 
     super.init() 
    } 

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

    func setHealth(amount: Int) { 
     self.health = amount 
    } 

    func getHealth() -> Int { 
     return self.health 
    } 

    func drawEnemy() -> SKShapeNode { 
     enemy = SKShapeNode(circleOfRadius: radius) 
     enemy.fillColor = color 
     enemy.glowWidth = 0.5 
     enemy.strokeColor = color 
     enemy.physicsBody = SKPhysicsBody(circleOfRadius: radius) 
     enemy.physicsBody?.affectedByGravity = false 
     enemy.physicsBody?.isDynamic = true 
     enemy.physicsBody?.collisionBitMask = GameScene.bodyType.player.rawValue 
     enemy.physicsBody?.categoryBitMask = GameScene.bodyType.enemy.rawValue 
     enemy.physicsBody?.contactTestBitMask = GameScene.bodyType.player.rawValue 
     enemy.physicsBody?.usesPreciseCollisionDetection = true 
     enemy.position = pos 
     return enemy 
    } 

} 

ошибка возникает, когда я проверяю, если health терке чем 0 или не в didBegin функции

+0

Вы не подклассифицируете правильно, ваш враг имеет тип SKShapeNode, а не типа Enemy – Knight0fDragon

+0

'enemy = SKShapeNode (circleOfRadius: radius)' <----- см. – Knight0fDragon

+0

да, но если я сделаю его врагом, как я делаю радиус?] –

ответ

4

Вы не являетесь должным образом подклассифицированы. Вы используете свой объект Enemy как фабрику, так и экземпляр, отделите 2.

Factory:

public class EnemyFactory 
{ 
    public func createEnemy(color: SKColor, radius: CGFloat, position: CGPoint) -> Enemy{ 
     let enemy = Enemy(circleOfRadius: radius) 
     enemy.setup(color:color, radius: radius, position: position) 
     return enemy 
    } 
} 

Instance Класс:

public class Enemy: SKShapeNode { 
    static let Factory = EnemyFactory() 
    public var health: Int = 5 

    func setup (color: SKColor, radius: CGFloat, position: CGPoint) { 
     self.position = position 
     fillColor = color 
     glowWidth = 0.5 
     self.health = 5 
     strokeColor = color 
     let physicsBody = SKPhysicsBody(circleOfRadius: radius) 
     physicsBody.affectedByGravity = false 
     physicsBody.isDynamic = true 
     physicsBody.collisionBitMask = GameScene.bodyType.player.rawValue 
     physicsBody.categoryBitMask = GameScene.bodyType.enemy.rawValue 
     physicsBody.contactTestBitMask = GameScene.bodyType.player.rawValue 
     physicsBody.usesPreciseCollisionDetection = true 
     self.physicsBody = physicsBody 
    } 
    override init(){ 
     super.init() 

    } 

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

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

+0

Давайте продолжим обсуждение в чате (http://chat.stackoverflow.com/rooms/134109/discussion-between-ahmed-nader-and-knight0fdragon). –

+0

Давайте продолжим обсуждение в чате (http://chat.stackoverflow.com/rooms/134126/discussion-between-knight0fdragon-and-muescha). – Knight0fDragon

+0

Почему бы не использовать skshapnodes? они медленнее? @Whirlwind –

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

  • Нет связанных вопросов^_^