Ios 如何区分精灵的副本
我有一个每2秒发生一次的函数,它创建一个Ios 如何区分精灵的副本,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我有一个每2秒发生一次的函数,它创建一个SKShapeNode。在任何时间点,屏幕上都有不止一个这样的精灵。当我调用另一个函数时,为了检测其中一个精灵与主要角色之间的接触,应用程序崩溃,因为didBeginContact函数不知道在哪个精灵上运行: func didBeginContact(contact: SKPhysicsContact) { enemy.runAction(SKAction.fadeOutWithDuration(1)) enemy.runA
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)您应该创建淡入/缩放/移除父节点的序列/组,因为节点需要位于场景(或节点树)中才能运行操作。在操作有机会运行之前,您正在从其父节点删除节点。