SKPhysicsContact未检测到categoryBitMask碰撞
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SKPhysicsContact未检测到categoryBitMask碰撞相关的知识,希望对你有一定的参考价值。
所以我下面的“Floor.swift”课程基本上是一堆墙。我有来自屏幕顶部的对象,一旦Floor和SKSpriteNodes发生碰撞,我希望删除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")
}
}
然后在“func didBegin(_ contact: SKPhysicsContact)
”下的GameScene课程中,我写道:
if (contact.bodyA.categoryBitMask == floorCategory) && (contact.bodyB.contactTestBitMask == objectCategory | pointCategory | lifeCategory) {
contact.bodyB.node!.removeFromParent()
print("COLLISION")
}
但出于某种原因,我没有得到任何检测。我在我的objectCategory,pointCategory,lifeCategory的每个类上使我的“Floor”类成为“contactTestBitMask”。我究竟做错了什么!?检测到我的其他碰撞,但没有检测到。
你的leftWall
,rightWall
和bottomWall
有默认的contactTest
和collision
位掩码,因此会与所有东西碰撞并产生任何东西的联系。除了他们所有的isDynamic
属性设置为false
,所以他们不能碰撞或接触任何东西(虽然其他东西可以碰撞并联系他们,如果其他东西有isDynamic
设置为true
)。
但这可能是你想要的(地板和墙壁通常不是动态的)。我怀疑真正的问题是Floor
类的对象不会有物理体,除非你在其他地方初始化它。你有这些线:
self.physicsBody?.categoryBitMask = ...
self.physicsBody?.contactTestBitMask = ...
self.physicsBody?.collisionBitMask = ...
但你还没有真正创造self.physicsBody
。你的代码会崩溃,除非你使用了可选链接(self,phyicsBody?
),因此Swift进入'?'并说“哦 - 它是可选的,不存在。我会在这里停下来“
至少,尝试使用3个墙体对象的物理体为Floor
对象创建物理体:
Self.physicsBody = SKPhysicsBody(Bodies: [leftWall.physicsBody, rightWall.PhysicsBoidy, bottomWall.physicsBody])
(SKPhysicsBody有一个初始化器,它需要一系列物理实体来创建一个新的物理体)。
以上是关于SKPhysicsContact未检测到categoryBitMask碰撞的主要内容,如果未能解决你的问题,请参考以下文章
didBeginContact:(SKPhysicsContact *)联系人未调用