1

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

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 中设置了一个断点并截取了屏幕截图。碰撞的物体是船和穿过角落的激光。

4

1 回答 1

1

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

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

于 2017-01-08T01:41:46.527 回答