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 есть инициализатор, который использует массив физических тел для создания нового физического тела).