需要我的 '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)")
}
}
希望这对您有所帮助,告诉我您的进展情况。
编码愉快
所以基本上,我有一个函数 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)")
}
}
希望这对您有所帮助,告诉我您的进展情况。
编码愉快