2015-10-30 2 views
0

У меня есть 3 спрайта, которые могут сталкиваться друг с другом и имеют contactTestBitMask и categoryBitMask. У меня было два спрайта, которые использовали метод didBeginContact, чтобы увидеть, столкнулись ли они, и он работал нормально, но теперь я не уверен, как установить его, чтобы проверять контакты нескольких объектов и запускать функцию, которая отличается в зависимости от того, какие два тела сталкиваются.Правильный способ использования didBeginContact в играх SpriteKit - Swift

Мои PhysicsCategory:

struct PhysicsCategory { 
    static let None: UInt32 = 0 
    static let All: UInt32 = UInt32.max 
    static let Bird: UInt32 = 0b1 
    static let Cloud: UInt32 = 0b10 
    static let Desk: UInt32 = 0b100 
    static let Star: UInt32 = 0b101 
    static let StarSpecial: UInt32 = 0b110 
} 

didBeginContact метод GameScene:

func didBeginContact(contact: SKPhysicsContact) { 
    var BirdBody: SKPhysicsBody? 
    var DeskBody: SKPhysicsBody? 
    var SpecialStarBody: SKPhysicsBody? 
    //var SpecialStarBody: SKPhysicsBody 
    if contact.bodyA.categoryBitMask == PhysicsCategory.Bird { 
     BirdBody = contact.bodyA 
     DeskBody = contact.bodyB 
    } else if contact.bodyA.categoryBitMask == PhysicsCategory.Desk { 
     BirdBody = contact.bodyB 
     DeskBody = contact.bodyA 
    } else if contact.bodyA.categoryBitMask == PhysicsCategory.StarSpecial { 
     SpecialStarBody = contact.bodyA 
    } 
    if (DeskBody != nil) { 
     birdSprite.BirdDidCollideWithDesk(BirdBody?.node as! Bird, desk: DeskBody?.node as! Desk, scoreClass: scoreClass, scoreLabel: scoreLabel) 
    } 
} 

То, что я хочу сделать, это проверить, если птица соприкасался с письменным столом и в этом случае, он должен запустите функцию для птицы и стола, в противном случае я хочу посмотреть, была ли птица соприкасалась со специальным стилем, я не написал функцию для того, что делать в этом случае, но позже я бы назвал другую функцию для Это дело. Я также добавляю дополнительные спрайты, поэтому я был бы признателен, если бы кто-нибудь мог объяснить, как это сделать, чтобы код был хорошо написан и не вызывал никаких ошибок.

ответ

2

Вы можете проверить, если птица связаться с письменным столом

if ((contact.bodyA.categoryBitMask == PhysicsCategory.Bird && contact.bodyB.categoryBitMask == PhysicsCategory.Desk) || 
(contact.bodyA.categoryBitMask == PhysicsCategory.Desk && contact.bodyB.categoryBitMask == PhysicsCategory.Bird)) { 

    print("Bird, desk") 
    // Handle contact bird with desk 
} 

Птица контакта с starSpecial

if ((contact.bodyA.categoryBitMask == PhysicsCategory.Bird && contact.bodyB.categoryBitMask == PhysicsCategory.StarSpecial) || 
(contact.bodyA.categoryBitMask == PhysicsCategory.Desk && contact.bodyB.categoryBitMask == PhysicsCategory.StarSpecial)) { 

    print("Bird, StarSpecial") 
    // Handle contact bird with StarSpecial 
} 

Только примечание: Переменные должны начинаться с буквы нижнего регистра.

Чтобы очистить код, я рекомендую создать файл класса для каждого узла.

import Foundation 
import SpriteKit 

class Monster: SKSpriteNode { 

    init(world: SKNode) { 

    super.init(texture: SKTexture(imageNamed: "MonsterImageName"), color: UIColor.clearColor(), size: CGSizeMake(world.frame.size.width/18, world.frame.size.width/36)) 
    position = CGPointMake(world.frame.size.width/2, world.frame.size.height/2) 
    zPosition = 100 

    // etc 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

И добавить его как этот

var monster = Monster.init(world) 
world.addChild(monster) 
+1

Спасибо, только что мне нужно! – Larisa

Смежные вопросы