即使不是直接接触物理学家,也要联系

时间:2015-06-19 15:06:39

标签: 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.physicsBody!.categoryBitMask = wall
self.physicsBody!.contactTestBitMask = player
self.physicsBody?.dynamic = true
self.name = "background"

现在最重要的是,还有另一个没有任何物理实体的SKSpriteNode,我们称之为path

过了一段时间,我产生了另一个节点,播放器节点位于path之上:

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

因此,在我看来,didBeginContact只有在playerNode被移出path节点之外并且真正触及背景时才会触发。

但目前,didBeginContact在我的path之上生成我的playerNode之后立即触发。

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

理解方面有点麻烦..但听起来你想要检测播放器节点何时退出路径节点的位置。

它触发了物理接触,因为无论如何,你的玩家节点总是会与场景的物理体相交。

实际上你不需要任何物理学。在您的更新方法中,您可以检查您的播放器是否与您的路径节点(或您关心的任何节点)相交。如果它不与那些相交,那么它就直接坐在你的世界,场景等中。

更新内部:

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