Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 为什么不能使用SKShapenode的子类?_Swift_Inheritance_Sprite Kit - Fatal编程技术网

Swift 为什么不能使用SKShapenode的子类?

Swift 为什么不能使用SKShapenode的子类?,swift,inheritance,sprite-kit,Swift,Inheritance,Sprite Kit,我在这里使用了一个名为敌方的子类,它继承自SKShapeNode,这里的问题是当我检查子弹和敌方之间的碰撞时,我获取敌方的健康状况它说在展开时发现了零 这是我的密码: private func drawEnemy() { let (color, edge) = randomColorandEdge() let nextEnemyPosition = determineNextEnemyPosition(edge: Int(edge)) let en

我在这里使用了一个名为
敌方
的子类,它继承自
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()
            }
        }
    }
这是我的
敌人
课程:

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
或不在
didbeagin
函数中时,会出现错误您没有正确地进行子类化,您将您的敌方对象用作工厂和实例,请将2分开

工厂:

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
    }
}
实例类:

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")
    }
}

我有一些自由:我删除了局部冗余变量,比如颜色和场景,你可以直接从对象中获取这些变量,不需要另一个变量来保存它们。您也不需要getter和setter,Swift已经为您完成了这项工作。

您没有正确地进行子类化,您正在使用您的敌人对象作为工厂和实例,将它们分开

工厂:

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
    }
}
实例类:

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")
    }
}

我有一些自由:我删除了局部冗余变量,比如颜色和场景,你可以直接从对象中获取这些变量,不需要另一个变量来保存它们。你也不需要getter和setter,Swift已经为你做了。

你没有正确的子类化,你的敌人是SKShapeNode类型,而不是敌人
敌人=SKShapeNode(circleOfRadius:radius)
是的,但是如果我把它设为敌人,我怎么做半径?]我正在为你写一个答案你没有正确的子类化,你的敌人是SKShapeNode类型,而不是敌方
敌方=SKShapeNode(circleOfRadius:radius)
是的,但如果我把它设为敌方,那么我将如何设置半径?]我正在为你写一个答案让我们来吧。让我们来吧。为什么不使用skshapenodes?他们慢了吗@Whirlwind是的,它们比较慢,而且很轻便,你真的应该使用SKSpriteNode。先学习如何使用SpriteKit,以后再担心性能会更好。我知道如何使用SpriteKit。请告诉我们。为什么不使用skshapnodes?他们慢了吗@Whirlwind是的,它们比较慢,而且很轻便,你真的应该使用SKSpriteNode。先学习如何使用SpriteKit,然后再担心性能会更好我知道如何使用它们是的