2015-08-04 24 views
5

Durum: Ben iOS ekranında iki veya daha fazla gemi. Her ikisi de isim, boyut, vuruş noktaları ve skor puanları gibi farklı özelliklere sahiptir. Bunlar SKSpriteNodes olarak gösterildi ve her biri bir physicsBody eklemiştir.Nasıl SKSpriteNode Swift çarpışma algılama etkilenir olduğunu öğrenmek için?

anda bu ekstra özellikler genişletilmiş SKSpriteNode sınıfın değişkenlerdir. Bu 'oyun' o gemilerden ateş edebilir ve en kısa sürede bir mermi bir gemiyi vurur gibi, sen puan almak yılında

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

. 'Bir gemiye çarptı' çarpışma ile tespit edilir.

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

Sorun: Çarpışma algılama sadece physicsBody döner ve sadece bu physicsBody benim genişletilmiş SKSpriteNode sınıfı nasıl bilmiyorum.

Düşünceler: Nesneleri bir gemi gibi yaşamak için SKSpriteNode'u uzatmanın doğru bir yolu mu? Benim ekranına bir gemi eklediğinizde benzediğini:

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

Yoksa bu sadece bir yanlış yaklaşım ve hangi falan çarpışma aracılığıyla bir kurşuna kurban edilir istatistiklerle nesne öğrenmek için çok daha iyi bir yol yoktur algılama?

Bu soru benim diğer question benzer - Sadece geniş anlamıyla bu sormak istiyorum.

cevap

8

SKPhysicsBody, node numaralı ürünle ilişkilendirilmiştir; bu, gövdeyle ilişkili SKNode'dir. Sadece kendi Ship sınıfa bir conditional cast gerçekleştirmek gerekir.

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

Ship düğüm yüzden bodyB ilişkili biri olabilir unutmayın.

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

Bu yardımcı olur umarım.

+1

Sonunda birisi bana doğru çözümü verdi - çok teşekkür ederim. Şimdi bu satırı kullanıyorum 'var ship = bodyA.categoryBitMask == bubbleCategory? bodyA.node olarak? Gemi: bodyB.node olarak? Ship'. Ve bu, oyun nesnesini skor ve vuruş noktaları gibi ilgili verileri kaydetmek için doğru bir yaklaşım mı? Çözümü birkaç farklı oyun nesnesi ile test edeceğim ve her şey işe yarayacak en kısa sürede bunu doğru cevap olarak işaretleyeceğim. – Jurik

İlgili konular