2015-08-04 9 views
5

Situation: Ich habe zwei oder mehr Schiffe auf meinem iOS-Bildschirm. Beide haben unterschiedliche Attribute wie Name, Größe, Hitpoints und Punkte. Sie werden als SKSpriteNodes angezeigt und jeder hat eine physicsBody hinzugefügt.Wie kann man herausfinden, welcher SKSpriteNode in Swift von der Kollisionserkennung betroffen ist?

Im Moment sind diese zusätzlichen Attribute Variablen einer erweiterten SKSpriteNode Klasse.

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 diesem ‚Spiel‘ Sie auf diesen Schiffen schießen und so bald wie eine Kugel, ein Schiff trifft, erhalten Sie Punkte. 'Hits a ship' wird durch Kollision erkannt.

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

Problem: Kollisionserkennung gibt nur eine physicsBody und ich weiß nicht, wie meine erweiterte SKSpriteNode Klasse erhalten gerade dieses physicsBody.

Gedanken: Ist es ein richtiger Weg, um SKSpriteNode zu verlängern, um meine Objekte wie ein Schiff zum Leben zu erwecken? Wenn ich ein Schiff zu meinem Bildschirm hinzufügen sieht es so aus:

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

ist oder dies nur ein falscher Ansatz, und es gibt eine viel bessere Weise, die mit Statistiken Objekt, um herauszufinden, so und so durch eine Kugel durch Kollision getroffen wird Erkennung?

Diese Frage ist ähnlich wie meine anderen question - Ich möchte nur im weiteren Sinne fragen.

Antwort

8

Die SKPhysicsBody hat eine Eigenschaft node die SKNode ist, die mit dem Körper verbunden ist. Sie müssen nur eine conditional cast zu Ihrer Ship Klasse durchführen.

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)!!!") 
    } 

Bitte beachten Sie, dass die Ship Knoten derjenige mit bodyB so in Verbindung gebracht werden könnten.

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

Hoffe, das hilft.

+1

Endlich gab mir jemand die richtige Lösung - vielen Dank. Ich benutze jetzt diese Zeile 'var ship = bodyA.categoryBitMask == bubbleCategory? bodyA.node als? Schiff: bodyB.node als? Schiff'. Und das ist der richtige Ansatz, um spielobjektrelevante Daten wie Score und Hitpoints zu speichern? Ich werde die Lösung mit mehreren verschiedenen Spielobjekten testen und sobald alles funktioniert, werde ich dies als richtige Antwort markieren. – Jurik

Verwandte Themen