在SpriteKit中“吃”东西的最好方法

时间:2017-09-11 22:26:21

标签: swift sprite-kit skphysicscontact

通过“吃”我的意思是:当精灵A(马里奥)与精灵B(硬币)碰撞时,检测到碰撞并从场景中移除硬币;然而,马里奥的运动并没有因与硬币的碰撞而改变。

目前我正在使用SKPhysicsContactDelegate注册Mario和硬币相撞时,但这似乎要求将硬币确认为身体 - 因此这意味着马里奥的动作被它停止了。 p>

如果硬币没有物理机构,我应该使用不同的方法来查看它们是否接触?

2 个答案:

答案 0 :(得分:3)

根据Apple ...

  

var categoryBitMask:UInt32定义此类别的掩码   物理机构属于。

     

var collisionBitMask:UInt32定义哪些类别的掩码   物理团体可以与这个物理团体发生碰撞。

     

var contactTestBitMask:UInt32定义哪些类别的掩码   物体会导致该物理体的交叉通知。

所以如果你只是在" Mario"上设置contactTestBitMask?硬币categoryBitMask,并设置collisionBitMask on" Mario"到0(或不是硬币类别BitMask)你应该能够分辨出2在didBegin(_ contact: SKPhysicsContact) func中碰撞但硬币不会妨碍马里奥的运动

答案 1 :(得分:2)

在Mario和硬币之间设置联系人而不设置碰撞

然而,如果你想要当马里奥击中它时硬币反弹,没有马里奥的运动受到影响,你可以,除了马里奥和硬币之间的接触,设置硬币和马里奥之间的碰撞但不是马里奥和硬币之间。

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

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

请注意,这种“单向”碰撞设置对联系人不起作用,即如果马里奥设置为与马里奥的contactTestBitMask包括硬币的类别联系硬币,那么如果硬币的{{1}则无关紧要包括马里奥的类别或不包括)