0

The first time I call this it works great. Enemies are loaded in exactly where I'd like them to be... The goal is when the current wave of enemies are defeated... a second wave of enemies are loaded in exactly the same repetitive way.

The second time I call "loadPatternEnemies(number:Int)" I get the "in here?" in the console... but no enemies are added...

What am I doing wrong here?

func loadPatternEnemies(number:Int) {
        switch number {
        case 0:
            print("in here?")
            let parentTimer = Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: #selector(self.addEnemyToScene(timer:)), userInfo: nil, repeats: true)
            enemySpawnTimers.append(parentTimer)
            enemiesInCurrentWaveLeftToKill = positions.count
        default:
            print("default reached")
        }
    }

@objc func addEnemyToScene(timer: Timer) {
    if indexForPositions == positions.count {
        enemySpawnTimers[currentWaveNumber].invalidate()
        indexForPositions = 0
    } else {
        var newEnemy = Enemy()
        newEnemy.health = 1
        newEnemy.position = SCNVector3(positions[indexForPositions].x,positions[indexForPositions].y,positions[indexForPositions].z)
        newEnemy.name = "enemy\(enemiesInSceneArray.count)"
        newEnemy.timerToShoot = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(self.enemyFireBullet(timer:)), userInfo: newEnemy, repeats: true)
        enemiesInSceneArray.append(newEnemy)

        let enemyNode = SCNNode(geometry: SCNSphere(radius: 2))
        enemyNode.position = newEnemy.position
        enemyNode.name = newEnemy.name
        enemyNode.physicsBody = SCNPhysicsBody(type: .static, shape: SCNPhysicsShape(geometry: enemyNode.geometry!, options: nil))
        enemyNode.physicsBody?.categoryBitMask = BitMaskCategory.enemy.rawValue
        self.sceneView.scene.rootNode.addChildNode(enemyNode)

        indexForPositions += 1
    }
}

func enemyHit(bulletNode : SCNNode, enemyNode : SCNNode) {
    bulletNode.removeFromParentNode()
    if let index = enemiesInSceneArray.index(where: { $0.name == enemyNode.name }) {
        enemiesInSceneArray[index].health -= 1
        if enemiesInSceneArray[index].health <= 0 {
            enemiesInSceneArray[index].timerToShoot.invalidate()
            enemyNode.removeFromParentNode()
            score += 1
            enemiesInCurrentWaveLeftToKill -= 1
        }

        if enemiesInCurrentWaveLeftToKill == 0 && score > 2 {
            currentWaveNumber += 1
            loadPatternEnemies(number: 0)
        }
    }
}
R Bradshaw
  • 173
  • 11
  • Why not add a timer function to your `Enemy` class that way you can initialize a new timer for each new instance of `Enemy` created. – Jake Mar 20 '18 at 02:22
  • I have that for each enemy to shoot. But this timer would be for waves of enemies to appear on screen ala Space Invaders. So it wouldn't make sense to include that in the Enemy Class in this case. – R Bradshaw Mar 20 '18 at 16:57

0 Answers0