如何区分精灵的副本

时间:2015-11-19 01:41:22

标签: ios swift sprite-kit

我有一个每2秒发生一次的函数,创建一个SKShapeNode。在任何时间点,屏幕上都有不止一个精灵。当我调用另一个函数时,为了检测其中一个精灵和主角之间的联系,应用程序崩溃,因为didBeginContact函数不知道要运行哪个精灵:

func didBeginContact(contact: SKPhysicsContact) {
        enemy.runAction(SKAction.fadeOutWithDuration(1))
        enemy.runAction(SKAction.scaleTo(1.5, duration: 1))
        enemy.removeFromParent()
    }

精灵正在创造:

func Enemy(){
let enemy = SKShapeNode(circleOfRadius: 15)
self.addChild(enemy)
enemy.runAction(SKAction.moveTo(CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)), duration: 2.0))
    }

无论如何要区分Swift中的副本,例如可以为每个副本调用的唯一键吗?

2 个答案:

答案 0 :(得分:0)

contact.bodyA.node是主角或碰撞精灵。 contact.bodyB.node是另一个。

为敌人制作一个子类:

class Enemy: SKSpriteNode { }

使用它:

func addEnemy(){
    let enemy = Enemy(circleOfRadius: 15)
    self.addChild(enemy)
    enemy.runAction(SKAction.moveTo(CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)), duration: 2.0))
}

检查:

func didBeginContact(contact: SKPhysicsContact) {
    if let enemy = contact.bodyA.node as? Enemy {
        removeEnemy(enemy)
    } else if let enemy = contact.bodyB.node as? Enemy {
        removeEnemy(enemy)
    }
}

func removeEnemy(enemy: Enemy) {
    enemy.runAction(SKAction.fadeOutWithDuration(1))
    enemy.runAction(SKAction.scaleTo(1.5, duration: 1))
    enemy.removeFromParent()
}

答案 1 :(得分:0)

制作敌人子类:

class Enemy: SKShapeNode { }

使用存储ID的属性:

var ID: String?

在敌人创建期间设置ID:

func Enemy(){
    let enemy = SKShapeNode(circleOfRadius: 15)
    enemy.ID = a unique ID
    self.addChild(enemy)
    enemy.runAction(SKAction.moveTo(CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)), duration: 2.0))
}

检查

中的敌人ID
func didBeginContact(contact: SKPhysicsContact) {    
  if let enemy = contact.bodyA.node as? Enemy {
    if enemy.ID = ...
  } else if let enemy = contact.bodyB.node as? Enemy {
    if enemy.ID = ...
  }