2015-08-04 12 views
5

Situazione: Ho due o più navi sul mio schermo iOS. Entrambi hanno attributi diversi come nome, dimensione, hitpoint e punteggio. Sono visualizzati come SKSpriteNodes e ognuno ha aggiunto un physicsBody.Come sapere quale SKSpriteNode è interessato dal rilevamento delle collisioni in Swift?

Al momento questi attributi aggiuntivi sono variabili di una classe estesa SKSpriteNode.

import SpriteKit  
class ship: SKSpriteNode { 
      var hitpoints: Int = nil? 
      var score: Int = nil? 

     func createPhysicsBody(){ 
      self.physicsBody = SKPhysicsBody(circleOfRadius: self.size.width/2) 
      self.physicsBody?.dynamic = true 
      ... 
     } 
    } 

In questo 'gioco' si può sparare a quelle navi e, non appena un proiettile colpisce una nave, si ottengono punti. 'Hits a ship' viene rilevato dalla collisione.

func didBeginContact(contact: SKPhysicsContact){  
    switch(contact.bodyA.categoryBitMask + contact.bodyB.categoryBitMask){ 
     case shipCategory + bulletCategory: 
      contactShipBullet(contact.bodyA, bodyB: contact.bodyB) 
      break; 
     default: 
      break; 
    } 
} 

Problema: rilevamento delle collisioni solo restituisce un physicsBody e non so come ottenere il mio estesa SKSpriteNode classe proprio da questo physicsBody.

Pensieri: È un modo corretto di estendere lo SKSpriteNode per dare vita ai miei oggetti come una nave? Quando aggiungo una nave per il mio schermo sembra:

var ship = Ship(ship(hitpoints: 1, score: 100), position: <CGPosition>) 
self.addChild(ship) 

O è solo un approccio sbagliato e non v'è un modo molto migliore per scoprire quale oggetto con statistiche così e così viene colpito da un proiettile attraverso collisione rilevamento?

Questa domanda è simile all'altra question - Voglio solo chiedere questo in senso lato.

risposta

8

Il SKPhysicsBody ha una proprietà node che corrisponde al SKNode associato al corpo. Hai solo bisogno di eseguire un conditional cast per la tua classe Ship.

if let ship = contact.bodyA.node as? Ship { 
     // here you have your ship object of type Ship 
     print("Score of this ship is: \(ship.score)!!!") 
    } 

Si prega di notare che il nodo Ship potrebbe essere quello associato con bodyB così.

if let ship = contact.bodyA.node as? Ship { 
     // here you have your ship... 
    } else if let ship = contact.bodyB.node as? Ship { 
     // here you have your ship... 
    } 

Spero che questo aiuti.

+1

Finalmente qualcuno mi ha dato la soluzione giusta - grazie mille. Sto usando ora questa riga 'var ship = bodyA.categoryBitMask == bubbleCategory? bodyA.node as? Nave: bodyB.node as? Ship'. E questo è l'approccio corretto per salvare i dati rilevanti dell'oggetto di gioco come il punteggio e gli hitpoint? Verificherò la soluzione con diversi oggetti di gioco diversi e non appena tutto funzionerà, contrassegnerò questa come risposta corretta. – Jurik