Обнаружение столкновения между узлами Sprite в Swift 4 с использованием didBegin() не работает

Я использую основные движения, чтобы перемещать ниндзя по лабиринту. Я хочу набирать очки каждый раз, когда ниндзя попадает в монету, и я хочу показать "Вы выиграли", когда ниндзя попадает в дверь в конце лабиринта. Не могу понять, почему, но функция didBegin даже не напечатает "обнаружен контакт".

Я попробовал didBegin с "bodyA.node?.Name == "ninja"" также и не помогло

   import SpriteKit
   import CoreMotion

class GameScene: SKScene, SKPhysicsContactDelegate {
struct PhysicsCategory {
    static let ninja : UInt32 = 0b1 << 0
    static let coin : UInt32 = 0b1 << 1
    static let door : UInt32 = 0b1 << 2
}
let manager = CMMotionManager()
var door = SKSpriteNode()
var ninja = SKSpriteNode()
var coin = SKSpriteNode()
var points = Int()

  override func didMove(to view: SKView) {  
     self.physicsWorld.contactDelegate = self
     door = self.childNode(withName: "door") as! SKSpriteNode
     ninja = self.childNode(withName: "ninja") as! SKSpriteNode
     coin = self.childNode(withName: "coin") as! SKSpriteNode

     ninja.physicsBody = SKPhysicsBody(rectangleOf: ninja.size)
     ninja.physicsBody?.contactTestBitMask = 1
     door.physicsBody = SKPhysicsBody(rectangleOf: door.size)
     door.physicsBody?.affectedByGravity = false
     door.physicsBody?.isDynamic = true
     coin.physicsBody = SKPhysicsBody(circleOfRadius: coin.size.width/2.0)
    coin.physicsBody?.contactTestBitMask = 2
    coin.physicsBody!.affectedByGravity = false
    coin.physicsBody!.isDynamic = true

    ninja.physicsBody?.categoryBitMask = PhysicsCategory.ninja
    ninja.physicsBody?.collisionBitMask = PhysicsCategory.coin | PhysicsCategory.door
door.physicsBody?.categoryBitMask = PhysicsCategory.door
door.physicsBody?.collisionBitMask = PhysicsCategory.ninja

coin.physicsBody?.categoryBitMask = PhysicsCategory.coin
coin.physicsBody?.collisionBitMask = PhysicsCategory.ninja

    points = 0



    manager.startAccelerometerUpdates()
    manager.accelerometerUpdateInterval = 0.1
    let myQueue = OperationQueue()
    manager.startAccelerometerUpdates(to: myQueue){
        (data, error) in
        if let myData = data {

            self.physicsWorld.gravity = CGVector(dx: 
  CGFloat((myData.acceleration.x)) * 10, dy: 
  CGFloat((myData.acceleration.y)) * 10)
        }
        if let err = error {
            print("error")
            self.manager.stopAccelerometerUpdates()
        }
    }


    func didBegin(_ contact: SKPhysicsContact){
        var firstBody = SKPhysicsBody()
        var secondBody = SKPhysicsBody()

        if contact.bodyA.categoryBitMask < 
  contact.bodyB.categoryBitMask {
            firstBody = contact.bodyA
            secondBody = contact.bodyB
        } else {
            firstBody = contact.bodyB
            secondBody = contact.bodyA
        }

        if (firstBody.categoryBitMask) != 0 && 
  (secondBody.categoryBitMask) != 0 {
        firstBody.node?.removeFromParent()   
        points += 1
        }
    }

0 ответов

Другие вопросы по тегам