Обнаружение столкновения между узлами 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
}
}