需要我的 'enemyBall' 具有函数作用域的变量实例,以便在外部可以访问

Need my 'enemyBall' variable instances with function scope, to be made accessible outside

所以基本上,我有一个函数 spawnEnem() 生成敌人并使用 NSTimer 在特定时间间隔运行代码。我还有一个接触函数,可以处理游戏中对象之间的所有接触。在另一个函数 func didBegin(_ contact: SKPhysicsContact) 中,我尝试调用在 spawnEnem() 中实例化的 enemyBall 变量,但由于显而易见的原因,它无法获取它。我已经在 spawnEnum() 中声明了 enemyBall 实例,因为每次调用函数时我都需要创建和处理它的新实例。无论如何要让 enemyBall 实例超越它所在的函数?

SpawnEnem 函数

@objc func spawnEnem() {

        let enemyBall = SKSpriteNode(imageNamed: "enemyBall")


        self.addChild(enemyBall)
        enemyBall.size = CGSize(width: 25.0, height: 25.0)
        enemyBall.physicsBody = SKPhysicsBody(circleOfRadius: enemyBall.size.width/2)
        enemyBall.physicsBody?.affectedByGravity = true


        // Physics of our enemy
        enemyBall.physicsBody = SKPhysicsBody(circleOfRadius: enemyBall.size.width / 2)
        enemyBall.physicsBody?.categoryBitMask = PhysicsCatagroy.EnemyHere // setting enemyBall to our physics
        enemyBall.physicsBody?.contactTestBitMask = PhysicsCatagroy.smallBall | PhysicsCatagroy.mainBall 
        enemyBall.physicsBody?.collisionBitMask = PhysicsCatagroy.smallBall | PhysicsCatagroy.mainBall 
        enemyBall.physicsBody?.isDynamic = false // we dont want enemy effected by gravity
        enemyBall.name = "Enemy"
}

didBegin 联系功能

       func didBegin(_ contact: SKPhysicsContact) {
        let firstBody = contact.bodyA.node as! SKSpriteNode
        let secondBody = contact.bodyB.node as! SKSpriteNode


           if ((firstBody.name == "Enemy") && (secondBody.name == "smallBall")) {

            NSLog("ENEMY & SMALL Ball TOUCHED!")
            let emitter = SKEmitterNode(fileNamed: Emitter.enemyDead)!
            emitter.zPosition = 4
            emitter.targetNode = self
            emitter.position = enemyBall.position // ERROR IS HERE
            enemyBall.removeFromParent() // ERROR IS HERE
            addChild(emitter)

            collisonOnSmallBall(enemyBall: firstBody, smallBall: secondBody)

           } else if ((firstBody.name == "smallBall") && (secondBody.name == "Enemy")){
               score+=1
               NSLog("SMALL BALL & ENEMY TOUCHED!\(score)")
               collisonOnSmallBall(enemyBall: secondBody, smallBall: firstBody)
           } else if ((firstBody.name == "mainBall") && (secondBody.name == "Enemy")) {
               lives-=1
               NSLog("MAINBALL & ENEMY TOUCHED! \(lives)")

           }

       }

我一直在努力修复它,但我没有运气。这似乎是一个简单的问题,但事实证明它不适合我。

试试这个:

func didBegin(_ contact: SKPhysicsContact) {
    let firstBody = contact.bodyA.node as! SKSpriteNode
    let secondBody = contact.bodyB.node as! SKSpriteNode


       if ((firstBody.name == "Enemy") && (secondBody.name == "smallBall")) {

        NSLog("ENEMY & SMALL Ball TOUCHED!")
        let emitter = SKEmitterNode(fileNamed: Emitter.enemyDead)!
        emitter.zPosition = 4
        emitter.targetNode = self
        emitter.position = firstBody.position // <<<<<<<<<<<<<< LOOK
        firstBody.removeFromParent() // <<<<<<<<<<<<<< LOOK
        addChild(emitter)

        collisonOnSmallBall(enemyBall: firstBody, smallBall: secondBody)

       } else if ((firstBody.name == "smallBall") && (secondBody.name == "Enemy")){
           score+=1
           NSLog("SMALL BALL & ENEMY TOUCHED!\(score)")
           collisonOnSmallBall(enemyBall: secondBody, smallBall: firstBody)
       } else if ((firstBody.name == "mainBall") && (secondBody.name == "Enemy")) {
           lives-=1
           NSLog("MAINBALL & ENEMY TOUCHED! \(lives)")

       }

   }

希望这对您有所帮助,告诉我您的进展情况。

编码愉快