Swift 即使不是直接在身体上也要联系

Swift 即使不是直接在身体上也要联系,swift,sprite-kit,skphysicsbody,skphysicscontact,Swift,Sprite Kit,Skphysicsbody,Skphysicscontact,我有一个奇怪的行为SKPhysicsbody 首先,让我向您展示我的主节点: self.physicsWorld.contactDelegate = self self.physicsWorld.gravity = CGVectorMake(0, 0) self.physicsBody = SKPhysicsBody(rectangleOfSize: self.frame.size) self.physicsBody!.collisionBitMask = player self.physics

我有一个奇怪的行为
SKPhysicsbody

首先,让我向您展示我的主节点:

self.physicsWorld.contactDelegate = self
self.physicsWorld.gravity = CGVectorMake(0, 0)
self.physicsBody = SKPhysicsBody(rectangleOfSize: self.frame.size)
self.physicsBody!.collisionBitMask = player
self.physicsBody!.categoryBitMask = wall
self.physicsBody!.contactTestBitMask = player
self.physicsBody?.dynamic = true
self.name = "background"
除此之外,还有另一个没有任何物理体的SKSpriteNode,我们称之为
path

一段时间后,我生成了另一个节点,即
路径顶部的playernode

playerNode = SKSpriteNode(color: UIColor.blackColor(), size: CGSizeMake(tileSize/1, tileSize/1))
playerNode.position = CGPointMake(self.frame.width/2, self.frame.height/2)
playerNode.zPosition = 3

playerNode.name = "player"

playerNode.physicsBody = SKPhysicsBody(rectangleOfSize: playerNode.size)
playerNode.physicsBody!.categoryBitMask = player
playerNode.physicsBody!.collisionBitMask = wall
playerNode.physicsBody!.contactTestBitMask = wall
playerNode.physicsBody?.dynamic = false
因此,在我看来,只有当
playerNode
移动到
path
节点之外并且它确实接触到背景时,
didBeginContact
才应该触发

但目前,
didBeginContact
会在我在
路径上生成playerNode后立即触发


我遗漏了什么吗?

理解有点困难。。但它听起来像是您想要检测playernode何时退出路径节点的位置

它会触发物理接触,因为无论发生什么情况,玩家节点始终会与场景的物理体相交

事实上,这些都不需要物理。在更新方法中,您只需检查播放器是否与路径节点相交(或与您关心的节点相交)。如果它不与这些相交,那么它就直接位于你的世界、场景等中

更新内部:

if !playerNode.intersectsNode(path) {
    // your code here

问题是,我的背景总是在我的节点后面。我应该能够检查我的节点是否与背景接触,或者我的播放器和背景节点之间是否有节点。可以通过检查节点是否与任何其他节点相交来实现这一点。这就是我上面所描述的。@Christian如果内存正确地为我服务,物理体将忽略层、子对象和位置。这意味着,如果你的路径在一个物理体中,并且你在路径中添加了一个新的物理体,那么如果路径在第一个物理体中,它将触发didBeginContact。听起来好像你在试图检测玩家何时离开路径。哈莫比是正确的,你不需要物理来检测它,你可以检查它是否仍然与节点相交。