在swift中子类化子类(skspritenode)

时间:2016-01-05 07:17:19

标签: swift sprite-kit sprite subclass skspritenode

我目前制作的游戏中有多种类型的敌人,我目前使用SKSpriteNode的子类制作了基本敌人,一切正常。我现在想要实现基本敌人的另一个子类,因为所有的敌人都是相似的。我在创建新子类时遇到问题。任何帮助将非常感激。这是我的代码......

class Basic_Fighter : SKSpriteNode  {

    var health : Int = 3
    var ship_speed : Double = 7.0
    var bullet_rapidness : Double = Double ((arc4random_uniform(3) + 2) )
    var bullet_speed : Double = 3.0
    var action = SKAction()
    var bullet_Timer : NSTimer?


    func subtract_health(){ health-- }

    func enemy_killed(){
        let action = SKAction.moveToY(-1000, duration: 5)
        self.runAction(SKAction.repeatActionForever(action))
        let rotateAction = SKAction.rotateByAngle(CGFloat(M_PI), duration: 3)
        self.runAction(SKAction.repeatActionForever(rotateAction))

        //Set a timer to destoy the node
        _ = NSTimer.scheduledTimerWithTimeInterval(3.0, target: self, selector: Selector("destroy"), userInfo: nil, repeats: false)

    }

    func destroy(){
        self.removeFromParent()
    }
}

和下一个敌人......

class new_fighter : Basic_Fighter  {

    convenience init(){
        self.init()
        health = 5
    }
}

2 个答案:

答案 0 :(得分:1)

我不确定你问的是哪个问题,但这部分是错误的:

class new_fighter : Basic_Fighter  {
    convenience init(){
        self.init()
        health = 5
    }
}

如果没有指定的初始化程序,您不能按原样声明便利初始值设定项。也许你应该重新考虑关于指定与便利初始化器的部分的Swift语言参考。

来自documentation

  

... Swift对初始化程序之间的委托调用应用以下三个规则:

     

规则1

     

指定的初始化程序必须从其直接超类中调用指定的初始化程序。

     

规则2

     

便捷初始化程序必须从相同的类调用另一个初始化程序。

     

规则3

     

便利初始化程序必须最终调用指定的初始化程序。

答案 1 :(得分:1)

当您继承SKSPriteNode时,必须使用此指定的初始值设定项:

init(texture: SKTexture?, color: UIColor, size: CGSize)

并在您方便的初始化程序中调用:self.init(texture: texture, color: color, size: size)