SKPhysics Контакт Не Обнаружение Категория BitMask Collision

Итак, у меня есть мой класс "Floor.swift", который представляет собой кучу стен. У меня есть объекты, приходящие с верхней части экрана, и как только столкнутся Floor и SKSpriteNode, я бы хотел удалить SKSpriteNode. Ниже мой класс Пол.

import Foundation
import SpriteKit

    class Floor: SKNode {
        override init() {
            super.init()

            let leftWall = SKSpriteNode(color: UIColor.brown, size: CGSize(width: 5, height: 50))
            leftWall.position = CGPoint(x: 0, y: 50)
            leftWall.physicsBody = SKPhysicsBody(rectangleOf: leftWall.size)
            leftWall.physicsBody!.isDynamic = false
            self.addChild(leftWall)

            let rightWall = SKSpriteNode(color: UIColor.brown, size: CGSize(width: 5, height: 50))
            rightWall.position = CGPoint(x: 375, y: 50)
            rightWall.physicsBody = SKPhysicsBody(rectangleOf: rightWall.size)
            rightWall.physicsBody!.isDynamic = false
            self.addChild(rightWall)

            let bottomWall = SKSpriteNode(color: UIColor.brown, size: CGSize(width: 500, height: 10))
            bottomWall.position = CGPoint(x: 150, y: -5)
            bottomWall.physicsBody = SKPhysicsBody(rectangleOf: bottomWall.size)
            bottomWall.physicsBody!.isDynamic = false
            self.addChild(bottomWall)

            // Set the bit mask properties
            self.physicsBody?.categoryBitMask = floorCategory
            self.physicsBody?.contactTestBitMask = objectCategory | pointCategory | lifeCategory
            self.physicsBody?.collisionBitMask = dodgeCategory
        }

        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemted")
        }
    } 

Тогда в моем классе GameScene под "func didBegin(_ contact: SKPhysicsContact)" Я написал:

 if (contact.bodyA.categoryBitMask == floorCategory) && (contact.bodyB.contactTestBitMask == objectCategory | pointCategory | lifeCategory) {
              contact.bodyB.node!.removeFromParent()
              print("COLLISION")
}

Но по какой-то причине я не могу обнаружить, что происходит когда-либо. Я сделал свой класс "Floor" "contactTestBitMask" для каждого класса моей objectCategory, pointCategory, lifeCategory. Что я делаю неправильно!? Другие мои столкновения обнаружены, но не это.

1 ответ

Ваш leftWall, rightWall а также bottomWall по умолчанию contactTest а также collision битовые маски, поэтому будут сталкиваться со всем и генерировать контакты ни с чем. За исключением того, что все они имеют свои isDynamic свойство установлено в falseпоэтому они не могут ни с чем сталкиваться или контактировать (хотя другие вещи могут сталкиваться и связываться с ними, если эти другие вещи имеют isDynamic установлен в true).

Но это, вероятно, то, что вы хотите (полы и стены обычно не динамичны). Я подозреваю, что реальная проблема заключается в том, что объекты Floor У класса не будет физического тела, если вы не инициализируете его где-то еще. У вас есть эти строки:

self.physicsBody?.categoryBitMask = ...self.physicsBody?.contactTestBitMask = ...self.physicsBody?.collisionBitMask = ...

но вы на самом деле не создали self.physicsBody, Ваш код зависнет, если вы не используете опциональную цепочку (self,phyicsBody?) и так Свифт добирается до '?' и говорит: "О - это необязательно и не существует. Тогда я просто остановлюсь здесь.

По крайней мере, попробуйте создать физическое тело для вашего Floor Объект, использующий физические тела 3-х стеновых объектов:

Self.physicsBody = SKPhysicsBody(Bodies: [leftWall.physicsBody, rightWall.PhysicsBoidy, bottomWall.physicsBody])

(У SKPhysicsBody есть инициализатор, который использует массив физических тел для создания нового физического тела).

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