Swift 3(SpriteKit)从自定义类

时间:2018-01-12 05:44:19

标签: ios swift inheritance sprite-kit

我正在为IOS编写一个Bullet Hell类型的游戏,其中有多个敌人向玩家发射。对于敌人,我创建了一个名为Enemy的自定义类,它是SKSpritenode类的子类。

class Enemy : SKSpriteNode {

    var type : String;
    var health : Int;
    var armor : Int;
    var healthBar : HealthBar; //The HealthBar Class

    init(type: String, position: CGPoint, texture : SKTexture, color: UIColor, size: CGSize){
        self.type = type;
        self.health = enemyHealths[self.type]!
        self.armor = enemyArmors[self.type]!
        self.healthBar = HealthBar(healthBarWidth: 40, healthBarHeight: 4, hostile: true, health: self.health, maxHealth: self.health, position: position) //Initialize HealthBar
        super.init(texture: texture, color: color, size: size)

        self.position = position;
        self.physicsBody = SKPhysicsBody(rectangleOf: self.size);
        self.physicsBody?.affectedByGravity = false;
        self.physicsBody?.collisionBitMask = 0;
        self.physicsBody?.isDynamic = true;

        self.addChild(self.healthBar) //Add HealthBar Instance

    }

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

    func update(currentTime: TimeInterval){

    }
}

在这个类中,我初始化另一个类,一个HealthBar类,它也是SKSPritenode类的子类,但当我尝试将它作为子项添加到Enemy实例时,它显示在屏幕的最右侧。我想知道是否有特定的子位置机制正在实现这一点或它只是代码中的错误。我能想到的一件事可能是导致这个错误,当我更新HealthBar位置时,我将它的位置设置为与Enemy相同,后者作为孩子添加到GameScene。当健康栏作为子项添加到较小的敌人时,这可能会导致该坐标不可用时出错。

Swift Child Bug

正如你所看到的那样,Enemy产生了很好的效果,但是HealthBar位于屏幕的最右侧,而不是正好位于它应该存在的Enemy之上。

1 个答案:

答案 0 :(得分:0)

嗯,事实证明我的怀疑是正确的。由于您要将一个孩子添加到较小的敌人实例中,因此坐标CGPoint(x: 0, y: 0)对应于敌人实例的中心。因此,为了使健康栏位于敌人实例之上,您所需要的只是将其位置设置为上述坐标,并在Y值中使用小的正偏移量。