Swift 在Spritekit的多个级别中更改状态

Swift 在Spritekit的多个级别中更改状态,swift,sprite-kit,swift3,Swift,Sprite Kit,Swift3,我做了一个不同级别的游戏,但感觉它太扩展了。我用有限的知识创建了不同的级别,我认为可以更有效地进行编码。我想根据当前等级改变敌人的状态。 这是我的密码↓ func addEnemy() { if currentLevel == 1{ let enemyGhost = SKSpriteNode(imageNamed: "enemy") enemyGhost.setScale(random(min: 1.5, max: 2.5))

我做了一个不同级别的游戏,但感觉它太扩展了。我用有限的知识创建了不同的级别,我认为可以更有效地进行编码。我想根据当前等级改变敌人的状态。 这是我的密码↓

    func addEnemy() {
        if currentLevel == 1{
        let enemyGhost = SKSpriteNode(imageNamed: "enemy")
        enemyGhost.setScale(random(min: 1.5, max: 2.5))
        enemyGhost.physicsBody = SKPhysicsBody(rectangleOf: enemyGhost.size)
        enemyGhost.physicsBody?.isDynamic = true 
        enemyGhost.physicsBody?.categoryBitMask = PhysicsCategory.enemyGhost
        enemyGhost.physicsBody?.contactTestBitMask = PhysicsCategory.Projectile 
        enemyGhost.physicsBody?.collisionBitMask = PhysicsCategory.None
        let actualY = random(min: enemyGhost.size.height/2, max: size.height - enemyGhost.size.height/2)
        enemyGhost.position = CGPoint(x: size.width + enemyGhost.size.width/2, y: actualY)
        addChild(enemyGhost)
        let actualDuration = random(min: CGFloat(5.0), max: CGFloat(7.0))
        let actionMove = SKAction.move(to: CGPoint(x: -enemyGhost.size.width/2, y: actualY), duration: TimeInterval(actualDuration))
        let actionMoveDone = SKAction.removeFromParent()
        let loseAction = SKAction.run() {
        let reveal:SKTransition = SKTransition.flipHorizontal(withDuration: 0.5)
        let gameOverScene = GameOverScene(size: self.size, won: false)
        self.view?.presentScene(gameOverScene, transition: reveal)
        }
    enemyGhost.run(SKAction.sequence([actionMove, loseAction, actionMoveDone]))
    }
    else if currentLevel == 2 {
        let enemyGhost = SKSpriteNode(imageNamed: "enemy")
        enemyGhost.setScale(random(min: 1.0, max: 1.5))
        enemyGhost.physicsBody = SKPhysicsBody(rectangleOf: enemyGhost.size)
        enemyGhost.physicsBody?.isDynamic = true 
        enemyGhost.physicsBody?.categoryBitMask = PhysicsCategory.enemyGhost 
        enemyGhost.physicsBody?.contactTestBitMask = PhysicsCategory.Projectile 
        enemyGhost.physicsBody?.collisionBitMask = PhysicsCategory.None 
        let actualY = random(min: enemyGhost.size.height/2, max: size.height - enemyGhost.size.height/2)
        enemyGhost.position = CGPoint(x: size.width + enemyGhost.size.width/2, y: actualY)
        addChild(enemyGhost)
        let actualDuration = random(min: CGFloat(3.0), max: CGFloat(5.0))
        let actionMove = SKAction.move(to: CGPoint(x: -enemyGhost.size.width/2, y: actualY), duration: TimeInterval(actualDuration))
        let actionMoveDone = SKAction.removeFromParent()
        let loseAction = SKAction.run() {
            let reveal:SKTransition = SKTransition.flipHorizontal(withDuration: 0.5)
            let gameOverScene = GameOverScene(size: self.size, won: false)
            self.view?.presentScene(gameOverScene, transition: reveal)
        }
        enemyGhost.run(SKAction.sequence([actionMove, loseAction, actionMoveDone]))
        }
    }else if currentLevel == 3 {
        let enemyGhost = SKSpriteNode(imageNamed: "enemy")
        enemyGhost.setScale(random(min: 0.5, max: 1.0))
        enemyGhost.physicsBody = SKPhysicsBody(rectangleOf: enemyGhost.size) 
        enemyGhost.physicsBody?.isDynamic = true 
        enemyGhost.physicsBody?.categoryBitMask = PhysicsCategory.enemyGhost 
        enemyGhost.physicsBody?.contactTestBitMask = PhysicsCategory.Projectile 
        enemyGhost.physicsBody?.collisionBitMask = PhysicsCategory.None 
        let actualY = random(min: enemyGhost.size.height/2, max: size.height - enemyGhost.size.height/2)
        enemyGhost.position = CGPoint(x: size.width + enemyGhost.size.width/2, y: actualY)
        addChild(enemyGhost)
        let actualDuration = random(min: CGFloat(2.0), max: CGFloat(3.0))
        let actionMove = SKAction.move(to: CGPoint(x: -enemyGhost.size.width/2, y: actualY), duration: TimeInterval(actualDuration))
        let actionMoveDone = SKAction.removeFromParent()
        let loseAction = SKAction.run() {
            let reveal:SKTransition = SKTransition.flipHorizontal(withDuration: 0.5)
            let gameOverScene = GameOverScene(size: self.size, won: false)
            self.view?.presentScene(gameOverScene, transition: reveal)
        }
        enemyGhost.run(SKAction.sequence([actionMove, loseAction, actionMoveDone]))
        }

首先,我要为敌人创建一个单独的类,这样就不会重复太多初始化代码。然后,您可以为EnemyType创建一个枚举,根据敌人的类型或级别为敌人保存可变信息。然后,你只需根据敌人的类型创建敌人,敌人对象将不会获得所有必要的信息

值得注意的是,您的物理类别名称有不同的大小写“enemyGhost”和“Sproject”。它们应该是相同的情况

struct EnemyScale {
    var minScale: CGFloat = 0
    var maxScale: CGFloat = 0
}

enum EnemyType: Int {

    case level1, level2, level3

    var textureImage: String {

        switch self {

            case .level1: return "enemy"
            case .level2: return "enemy"
            case .level3: return "enemy"

        }
    }

    var scale: EnemyScale {

        switch self {

            case .level1: return EnemyScale(minScale: 1.5, maxScale: 2.5)
            case .level2: return EnemyScale(minScale: 1.0, maxScale: 1.5)
            case .level3: return EnemyScale(minScale: 0.5, maxScale: 1.0)

        }
    }
}

class Enemy: SKSpriteNode {

    init(type: EnemyType) {

        let enemyTexture = SKTexture(imageNamed: type.textureImage)

        super.init(texture: enemyTexture, color: .clear, size: enemyTexture.size())

        self.setScale(random(min: type.scaleMin, max: type.scaleMax))

        self.physicsBody = SKPhysicsBody(rectangleOf: self.size)
        self.physicsBody?.isDynamic = true
        self.physicsBody?.categoryBitMask = PhysicsCategory.enemyGhost
        self.physicsBody?.contactTestBitMask = PhysicsCategory.Projectile
        self.physicsBody?.collisionBitMask = PhysicsCategory.None
    }
}

func addEnemy() {

    if currentLevel == 1 {

        let enemyGhost = Enemy(type: .level1)
        let actualY = random(min: enemyGhost.size.height / 2, max: size.height - enemyGhost.size.height / 2)
        enemyGhost.position = CGPoint(x: size.width + enemyGhost.size.width / 2, y: actualY)
        self.addChild(enemyGhost)

        let actualDuration = random(min: CGFloat(5.0), max: CGFloat(7.0))
        let actionMove = SKAction.move(to: CGPoint(x: -enemyGhost.size.width / 2, y: actualY), duration: TimeInterval(actualDuration))
        let actionMoveDone = SKAction.removeFromParent()
        let loseAction = SKAction.run() {
            let reveal:SKTransition = SKTransition.flipHorizontal(withDuration: 0.5)
            let gameOverScene = GameOverScene(size: self.size, won: false)
            self.view?.presentScene(gameOverScene, transition: reveal)
        }
        enemyGhost.run(SKAction.sequence([actionMove, loseAction, actionMoveDone]))
    }
    else if currentLevel == 2 {

        let enemyGhost = Enemy(type: .level2)
        let actualY = random(min: enemyGhost.size.height / 2, max: size.height - enemyGhost.size.height / 2)
        enemyGhost.position = CGPoint(x: size.width + enemyGhost.size.width / 2, y: actualY)
        self.addChild(enemyGhost)

        let actualDuration = random(min: CGFloat(3.0), max: CGFloat(5.0))
        let actionMove = SKAction.move(to: CGPoint(x: -enemyGhost.size.width / 2, y: actualY), duration: TimeInterval(actualDuration))
        let actionMoveDone = SKAction.removeFromParent()
        let loseAction = SKAction.run() {
            let reveal:SKTransition = SKTransition.flipHorizontal(withDuration: 0.5)
            let gameOverScene = GameOverScene(size: self.size, won: false)
            self.view?.presentScene(gameOverScene, transition: reveal)
        }
        enemyGhost.run(SKAction.sequence([actionMove, loseAction, actionMoveDone]))
    }
    else if currentLevel == 3 {

        let enemyGhost = Enemy(type: .level3)
        let actualY = random(min: enemyGhost.size.height / 2, max: size.height - enemyGhost.size.height / 2)
        enemyGhost.position = CGPoint(x: size.width + enemyGhost.size.width / 2, y: actualY)
        self.addChild(enemyGhost)

        let actualDuration = random(min: CGFloat(2.0), max: CGFloat(3.0))
        let actionMove = SKAction.move(to: CGPoint(x: -enemyGhost.size.width / 2, y: actualY), duration: TimeInterval(actualDuration))
        let actionMoveDone = SKAction.removeFromParent()
        let loseAction = SKAction.run() {
            let reveal:SKTransition = SKTransition.flipHorizontal(withDuration: 0.5)
            let gameOverScene = GameOverScene(size: self.size, won: false)
            self.view?.presentScene(gameOverScene, transition: reveal)
        }
        enemyGhost.run(SKAction.sequence([actionMove, loseAction, actionMoveDone]))
    }
}

您的功能可以简化,因为它充满了冗余代码,如:

func addEnemy() {
        let enemyGhost = SKSpriteNode(imageNamed: "enemy")
        enemyGhost.physicsBody = SKPhysicsBody(rectangleOf: enemyGhost.size)
        enemyGhost.physicsBody?.isDynamic = true
        enemyGhost.physicsBody?.categoryBitMask = PhysicsCategory.enemyGhost.rawValue
        enemyGhost.physicsBody?.contactTestBitMask = PhysicsCategory.Projectile.rawValue
        enemyGhost.physicsBody?.collisionBitMask = PhysicsCategory.None.rawValue
        let actualY = random(min: enemyGhost.size.height/2, max: size.height - enemyGhost.size.height/2)
        enemyGhost.position = CGPoint(x: size.width + enemyGhost.size.width/2, y: actualY)
        addChild(enemyGhost)
        var actualDuration = random(min: CGFloat(5.0), max: CGFloat(7.0))
        switch currentLevel {
        case 1:
            enemyGhost.setScale(random(min: 1.5, max: 2.5))
        case 2:
            enemyGhost.setScale(random(min: 1.0, max: 1.5))
            actualDuration = random(min: CGFloat(3.0), max: CGFloat(5.0))
        case 3:
            enemyGhost.setScale(random(min: 0.5, max: 1.0))
            actualDuration = random(min: CGFloat(2.0), max: CGFloat(3.0))
        default:
            break
        }
        let actionMove = SKAction.move(to: CGPoint(x: -enemyGhost.size.width/2, y: actualY), duration: TimeInterval(actualDuration))
        let actionMoveDone = SKAction.removeFromParent()
        let loseAction = SKAction.run() {
            let reveal:SKTransition = SKTransition.flipHorizontal(withDuration: 0.5)
            let gameOverScene = GameOverScene(size: self.size, won: false)
            self.view?.presentScene(gameOverScene, transition: reveal)
        }
        enemyGhost.run(SKAction.sequence([actionMove, loseAction, actionMoveDone]))
}
关于您的敌人状态,请记住您可以使用
userData
()存储和检索特定属性,例如:

enemyGhost.userData? = NSMutableDictionary()
enemyGhost.userData = ["status":"aggressive"]
print(enemyGhost.userData?["status"] ?? "none")