didBeginContact 错误触发

didBeginContact falsely triggered

在我的游戏中,我有从一个点向前发射的激光。我使用此代码拉伸激光精灵并移动它以模拟更新函数中的运动:

let height = size.height
yScale += travelSpeed * CGFloat(time)
let difference = size.height - height
let xMove = sin(-zRotation) * difference * 0.5
let yMove = cos(-zRotation) * difference * 0.5
position = CGPoint(x: position.x + xMove, y: position.y + yMove)

一切看起来都很好 - 激光从一个点射出,view.showPhysics 中的物理 body 轮廓完全符合。但是,当玩家没有接触到激光时,有时会错误地触发 didBeginContact。为什么会这样?

编辑:

激光物理学Body:

    physicsBody = SKPhysicsBody(texture: texture!, size: size)
    physicsBody!.affectedByGravity = false
    physicsBody!.linearDamping = 0
    physicsBody!.collisionBitMask = 0
    physicsBody!.categoryBitMask = 1

玩家物理Body:

    physicsBody = SKPhysicsBody(circleOfRadius: 5)
    physicsBody!.affectedByGravity = false
    physicsBody!.linearDamping = 0
    physicsBody!.collisionBitMask = 0
    physicsBody!.contactTestBitMask = 1

所以它们被设置为当它们碰撞时调用 didBeginContact,它确实发生了。我遇到的问题是,当玩家没有接触时,有时也会调用 didBeginContact。我目前的假设是我的移动代码在 non-visible 瞬间或其他时间错位了激光的物理 body。

我在didBeginContact里面设置了一个断点,然后截图了。相撞的objects是飞船和对过拐角的激光

事实证明,如果您尝试将 sprite 拉伸到其原始大小的约 100 倍,物理体会变得 稍微 不准确。哎呀

我尝试在更新中重新应用一个新的物理体,这似乎有效。