"eat" SpriteKit 中某些东西的最佳方式

Best way to "eat" something in SpriteKit

"eat" 我的意思是:当精灵 A(马里奥)与精灵 B(一枚硬币)发生碰撞时,会检测到碰撞并将硬币从场景中移除;然而,马里奥的运动并没有因为与硬币的碰撞而改变。

目前我正在使用 SKPhysicsContactDelegate 来记录马里奥和硬币的碰撞时间,但这似乎需要将硬币确认为一个实体 - 因此这意味着马里奥的运动会被它停止。

硬币不应该有物理体吗,我应该用不同的方法看它们是否接触?

根据Apple...

var categoryBitMask: UInt32 A mask that defines which categories this physics body belongs to.

var collisionBitMask: UInt32 A mask that defines which categories of physics bodies can collide with this physics body.

var contactTestBitMask: UInt32 A mask that defines which categories of bodies cause intersection notifications with this physics body.

因此,如果您只是将 "Mario" 上的 contactTestBitMask 设置为硬币类别位掩码,并将 "Mario" 上的碰撞位掩码设置为 0(或不设置为硬币类别位掩码),您应该能够分辨当 2 在 didBegin(_ contact: SKPhysicsContact) 函数中发生碰撞但硬币不会阻碍马里奥的移动时

在马里奥和硬币之间设置接触,而不设置碰撞

但是,如果您希望硬币在马里奥击中时弹开,而不影响马里奥的移动,除了让马里奥和硬币接触之外,您还可以在硬币和马里奥之间设置碰撞 但不是在马里奥和硬币之间。

如果这样做,当马里奥击中硬币时,马里奥的移动不会受到影响,但硬币会通过物理模拟从马里奥身上反弹。

您可以通过将马里奥的 collisionBitMask 设置为不包括硬币的 categoryBitMask,但让硬币 collisionBitMask 包括马里奥的 categoryBitMask 来实现。

请注意,此 'one-way' 碰撞设置不适用于接触,即如果马里奥设置为接触硬币与马里奥的 contactTestBitMask 包括硬币类别,那么如果硬币的 contactTestBitMask 是否包括马里奥的类别)