didBeginContact错误地触发

时间:2017-01-06 19:00:23

标签: swift sprite-kit skphysicsworld

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

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完全遵循。但是,当玩家没有接触激光时,有时会错误地触发didBeginContact。为什么会这样?

编辑:

激光物理学主体:

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

球员物理身体:

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

所以他们进行了设置,以便在碰撞时调用didBeginContact,并且确实如此。我遇到的问题是,当玩家没有联系时,有时也会调用didBeginContact。我目前的假设是我的移动代码错误地放置了激光器。物理体对于不可见的瞬间或其他东西。

我在didBeginContact中设置了一个断点并截取屏幕截图。碰撞的物体是船和激光穿过角落。

1 个答案:

答案 0 :(得分:1)

事实证明,如果你试图将精灵拉伸到它的原始大小的100倍,那么物理体就会变得略微不准确。糟糕。

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