SpriteKit's didBeginContact не может быть вызван

Я тестировал простую сцену.

Func didBeginContact не может быть вызван.

Я пытаюсь использовать collisionBitMask и s1.physicsBody = SKPhysicsBody(circleOfRadius: 100). Проблема была постоянной.

Что я могу сделать, чтобы это исправить?

import SpriteKit

class Test2Scene: SKScene, SKPhysicsContactDelegate {
    override func didMoveToView(view: SKView) {
        physicsWorld.contactDelegate = self
        physicsWorld.speed = 0


        let s1 = SKSpriteNode(imageNamed: kImagePlayer)
        s1.position = CGPointMake(100, 100)
        s1.physicsBody = SKPhysicsBody(rectangleOfSize: s1.size)
        s1.physicsBody?.categoryBitMask = 1
        s1.physicsBody?.contactTestBitMask = 2
        //s1.physicsBody?.collisionBitMask = 2
        self.addChild(s1)


        let s2 = SKSpriteNode(imageNamed: kImagePlayer)
        s2.position = CGPointMake(100, 500);
        s2.runAction(SKAction.moveToY(0, duration: 1))
        s2.physicsBody = SKPhysicsBody(rectangleOfSize: s2.size)
        s2.physicsBody?.categoryBitMask = 2
        //s2.physicsBody?.collisionBitMask = 1
        self.addChild(s2);

        print("view did load")
    }

    func didBeginContact(contact: SKPhysicsContact) {
        print("aaa")
    }
    func didEndContact(contact: SKPhysicsContact) {
        print("bbb")
    }
}

person yao.h yao    schedule 21.04.2016    source источник
comment
И кое-что о реализации обнаружения контактов внутри метода didBeginContact: stackoverflow.com/a/36246855/3402095, stackoverflow.com/a/27389834/3402095, stackoverflow.com/a/20604762/3402095   -  person Whirlwind    schedule 21.04.2016


Ответы (2)


Ваш код в значительной степени неверен, но ваш нарушитель:

physicsWorld.speed = 0

Из документов:

Значение по умолчанию - 1.0, что означает, что моделирование выполняется с нормальной скоростью. Значение, отличное от значения по умолчанию, изменяет скорость, с которой время проходит в моделировании физики. Например, значение скорости 2,0 означает, что время при симуляции физики проходит в два раза быстрее, чем время симуляции сцены. Значение 0,0 приостанавливает симуляцию физики.

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

Также я бы рекомендовал прочитать этот замечательный пост на StackOverflow о битовых масках и о том, как они работают / должны использоваться.

person Whirlwind    schedule 21.04.2016

Узнай причину. Нужно использовать

s1.physicsBody!.dynamic = true
s2.physicsBody!.dynamic = true
person yao.h yao    schedule 22.04.2016
comment
Это не было причиной (по крайней мере, для данного кода), потому что для свойства dynamic по умолчанию установлено значение true developer.apple.com/library/ios/documentation/SpriteKit/ - person Whirlwind; 22.04.2016