2015-11-19 2 views
1

У меня есть функция, которая происходит каждые 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, такие как уникальный ключ, который можно вызвать для каждого?

+0

Используйте USERDATA, чтобы дать каждый скопировать уникальная идентификация. –

+1

Некоторые наблюдения .... 1) 'враг' в методе« Враг »- это локальная переменная (с ограниченным объемом). Я подозреваю, что «враг» в 'didBeginContact' не инициализирован или ссылается на другой объект, 2) вам нужно будет добавить физическое тело к узлам, чтобы вызвать контакт, 3) вы должны создать последовательность/группу, чтобы затухать/масштабировать/removeFromParent, потому что узел должен находиться в сцене (или дереве узлов) для запуска действия. Вы удаляете узел из своего родителя, прежде чем действия будут иметь шанс запустить. – 0x141E

ответ

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

Боюсь, ваш подход бессмыслен. Если вы его запустили, все копии узлов противника будут удалены. –

+0

Действительно? Устанавливая свойства 'collisionBitMask' и' categoryBitMask' соответствующим образом на узлах, vblaga может гарантировать, что 'didBeginContact' будет вызван только для коллизий между противником и игроком, поэтому каждый вызов будет удалять ровно одного врага, который находится в столкновении с игрок. –

0

сделать Enemy подкласс:

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 = ... 
    } 
Смежные вопросы