Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何区分精灵的副本_Ios_Swift_Sprite Kit - Fatal编程技术网

Ios 如何区分精灵的副本

Ios 如何区分精灵的副本,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我有一个每2秒发生一次的函数,它创建一个SKShapeNode。在任何时间点,屏幕上都有不止一个这样的精灵。当我调用另一个函数时,为了检测其中一个精灵与主要角色之间的接触,应用程序崩溃,因为didBeginContact函数不知道在哪个精灵上运行: func didBeginContact(contact: SKPhysicsContact) { enemy.runAction(SKAction.fadeOutWithDuration(1)) enemy.runA

我有一个每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中的副本是否有区别,例如可以为每个副本调用的唯一键?

联系人。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()
}

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()
}

创建一个子类:

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))
}
检查敌人的身份证

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 = ...
  }

创建一个子类:

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))
}
检查敌人的身份证

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 = ...
  }

恐怕你的方法毫无意义。如果你运行它,所有敌人的节点副本都会被删除。真的吗?通过在节点上适当设置
collisionBitMask
categoryBitMask
属性,vblaga可以确保
didBeginContact
仅在敌人和玩家发生碰撞时调用,因此,每次呼叫都会移除一个与玩家发生冲突的敌人。我担心你的方法毫无意义。如果你运行它,所有敌人的节点副本都会被删除。真的吗?通过在节点上适当设置
collisionBitMask
categoryBitMask
属性,vblaga可以确保
didBeginContact
仅在敌人和玩家发生碰撞时调用,因此,每次调用都将删除与玩家发生冲突的一个敌人。使用userData为每个副本提供一个唯一的标识。一些观察结果……1)
敌人
方法中的
敌人
是一个局部变量(范围有限)。我怀疑
didBeginContact
中的
敌方
未初始化或引用了其他对象,2)您需要向节点添加物理实体以触发接触,3)您应该创建淡入/缩放/移除父节点的序列/组,因为节点需要位于场景(或节点树)中才能运行操作。在操作有机会运行之前,您正在从其父节点删除节点。请使用userData为每个副本提供唯一标识。一些观察结果…
敌方
方法中的
敌方
是一个局部变量(范围有限)。我怀疑
didBeginContact
中的
敌方
未初始化或引用了其他对象,2)您需要向节点添加物理实体以触发接触,3)您应该创建淡入/缩放/移除父节点的序列/组,因为节点需要位于场景(或节点树)中才能运行操作。在操作有机会运行之前,您正在从其父节点删除节点。