didBegin (контакт) вызывается только один раз - PullRequest
0 голосов
/ 19 мая 2018

Я создаю игру и несколько раз вызываю функцию, которая добавляет узел на сцену.

Мне нужно знать, касается ли узел игрока.Проблема в том, что метод didBegin(contact) вызывается только тогда, когда первый экземпляр узла касается узла игрока, но не вызывается, когда другие вызываемые экземпляры касаются его.

Вот код, который яЯ использую:

class GameScene: SKScene, SKPhysicsContactDelegate {

    let circlePlayer = SKSpriteNode(imageNamed: "Player")

    self.physicsWorld.contactDelegate = self
    circlePlayer.position = CGPoint(x: self.frame.midX, y:
    self.frame.minY + circlePlayer.size.height * 3)

    circlePlayer.zPosition = 2

    //Physics for player

    circlePlayer.physicsBody = SKPhysicsBody(circleOfRadius:
    circlePlayer.size.height / 2)
    circlePlayer.physicsBody?.categoryBitMask = PhysicsNumbering.player
    circlePlayer.physicsBody?.contactTestBitMask =
    PhysicsNumbering.star

    //Star node is called multiple times
    let star = SKAction.sequence([SKAction.run(starEmitter), SKAction.wait(forDuration: 3)])

 }

Это функция звездного узла:

func starEmitter(){

    let star = SKSpriteNode(imageNamed: "15")

    //Physics World
    star.physicsBody = SKPhysicsBody(circleOfRadius: star.size.height / 2)
    star.physicsBody?.categoryBitMask = PhysicsNumbering.star
    star.physicsBody?.contactTestBitMask = PhysicsNumbering.player
    star.physicsBody?.affectedByGravity = false
    star.physicsBody?.isDynamic = true
    star.physicsBody?.collisionBitMask = 0

    star.zPosition = 0

    let tooMuch = self.frame.maxX

    let point1 = UInt32(tooMuch)


    star.position = CGPoint(x: CGFloat(arc4random_uniform(point1 * 2)) - CGFloat(point1)  ,y: self.frame.maxY )

    let move = SKAction.moveTo(y: self.frame.minY + 100, duration: 1.4)
    let removeNode = SKAction.removeFromParent()

    let sequence = SKAction.sequence([move,removeNode])

    star.run(sequence)
    addChild(star)
}

И это метод didBeginContact:

func didBegin(_ contact: SKPhysicsContact) {

    var BodyOne = SKPhysicsBody()
    var BodyTwo = SKPhysicsBody()


    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask{
        BodyOne = contact.bodyA
        BodyTwo = contact.bodyB
    }
    else{
        BodyOne = contact.bodyB
        BodyTwo = contact.bodyA
    }

    //------------------------------------



    if BodyTwo.categoryBitMask == PhysicsNumbering.player && BodyOne.categoryBitMask == PhysicsNumbering.star{


        let scaleUp = SKAction.scale(by: 1.3, duration: 0.5)
        let fadeOut = SKAction.fadeOut(withDuration: 1)
        let removeNode = SKAction.removeFromParent()
        BodyOne.node?.removeAllActions()
        let group = SKAction.group([scaleUp,fadeOut])
        BodyOne.node?.run(SKAction.sequence([group,removeNode]))
        print("star touched")
    }


}

Я пытался найтиэто онлайн, но не мог найти причину, почему это могло произойти.Может кто-нибудь сказать мне, что я делаю не так?

Заранее спасибо!

...