Sprite Kit никогда не обнаруживает мое столкновение

Когда тело игрока встречает тело монстра, функция func didBeginContact(contact: SKPhysicsContact) никогда не называется.

Мой класс реализовать SKPhysicsContactDelegate

class GameScene: SKScene, SKPhysicsContactDelegate

недвижимость collisionBitMask я прокомментировал это, потому что я прочитал, что, если мы не поместим это, узел может столкнуться со всем узлом

Я добавляю свой плеер так:

bear.position = CGPoint(x:self.frame.width/20, y:self.frame.height/5)
bear.size = CGSize(width:  self.frame.width/7, height:  self.frame.height/5)
bear.physicsBody = SKPhysicsBody(rectangleOfSize: bear.frame.size)
bear.physicsBody?.dynamic = false;
bear.physicsBody?.categoryBitMask = PhysicsCategory.Player
bear.physicsBody?.contactTestBitMask = PhysicsCategory.Monster
//bear.physicsBody?.collisionBitMask = PhysicsCategory.Monster

Я добавляю монстра вот так:

           let thePosition = CGPoint(x: positionX, y: (self.frame.height/7.4)*positionY)

        let monster =  SKSpriteNode(imageNamed: pattern as String)
        monster.size = CGSize(width:  self.frame.width/16, height:  self.frame.height/11)
        monster.name = name
        monster.position = thePosition


         monster.physicsBody = SKPhysicsBody(rectangleOfSize: monster.frame.size)



        monster.physicsBody?.dynamic = false
        monster.physicsBody?.categoryBitMask = PhysicsCategory.Monster // 3
        monster.physicsBody?.affectedByGravity = false
        monster.physicsBody?.contactTestBitMask = PhysicsCategory.Player // 4
        //platformNode.physicsBody?.collisionBitMask = PhysicsCategory.Player // 5


        addChild(monster)

моя физическая категория

struct PhysicsCategory {
  static let None      : UInt32 = 0
  static let All       : UInt32 = UInt32.max
  static let Player: UInt32 = 0b1      // 1
  static let Monster   : UInt32 = 0b10       // 2
  static let Projectile: UInt32 = 0b100      // 3
  static let Plateforme: UInt32 = 0b1000      // 4
}

У меня есть несколько текстур, например, когда игрок идет, я называю это:

    func walkingBear() {
    bear.runAction(    SKAction.repeatActionForever(SKAction.animateWithTextures(bearCoursFrames, timePerFrame: 0.1, resize: false, restore: true)), withKey:"cours")
  }

Я инициализирую BearCoursFrames, как это

  var walkFrames = [SKTexture]()
    var numImages : Int = bearAnimatedAtlas.textureNames.count
    for var i=1; i<=numImages/2; i++ {
        let bearTextureName = "cours\(i)"
        walkFrames.append(bearAnimatedAtlas.textureNamed(bearTextureName))
    }

    bearCoursFrames = walkFrames

Где моя ошибка, пожалуйста, я не могу найти решение в другом посте, любая помощь будет оценена

---------------------------------РЕДАКТИРОВАТЬ---------------- -------------- Решение: я просто добавляю self.physicsWorld.contactDelegate = self, и теперь оно работает.

2 ответа

Решение

Я просто добавляю

       self.physicsWorld.contactDelegate = self 

и это работает сейчас.

Ответ прост. Существует правило, согласно которому по крайней мере одно тело должно быть определено как динамическое, чтобы зарегистрировать контакт.

Измените или игрока или другое тело, чтобы быть динамичным, и контакт будет обнаружен.

Кроме того, если у вас уже нет, включите визуальное представление физики... Это может быть полезно, потому что иногда контакт не обнаруживается, потому что фактические тела не пересекаются друг с другом, например. когда точка привязки узла изменяется, таким образом, текстура и тело смещаются (это можно исправить, используя соответствующие инициализаторы класса SKPhysicsBody, но это очень распространенная ошибка).

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