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