如果对象在swift中快速移动,如何测试碰撞

时间:2015-08-29 15:28:56

标签: xcode swift sprite-kit

目前我正在测试collisionImpulse并且它在95%的时间内工作,但每隔一段时间,对象以相同的速度直接通过精灵但返回更大的数字。我希望两个物体在缓慢移动时发生碰撞,但如果快速移动则触发动作。

这就是我现在正在做的事情

 func didBeginContact(contact: SKPhysicsContact) {
    if(contact.bodyB.node?.name == "sprite" && contact.bodyA.node?.name == "object") {
        if(contact.collisionImpulse > 3e-5){

我的collisionImpulse输出如下:

0.317869

0.285309

0.899219

0.0272814

0.325666

6.4235e-09

最后一个是直接通过但屏幕上显示与其他屏幕相同的那个。

一个我想反弹的看起来像

1.71999e-07

我错过了其他地方的东西吗?或者是否有更好的测试方法可以产生更一致的结果?

1 个答案:

答案 0 :(得分:1)

您可能想要研究的一件事是名为“Newtonian Seconds”的属性,每个SKContact(在您的“didbegincontact”方法中)将具有此值。基本上这最终代表了碰撞的难度。因此,如果它是一颗子弹,那么它将非常高,但是如果它是来自其他人的水龙头,则该值将非常低。

就我个人而言,我实际上会按类别进行此操作,并测试位掩码。基本上你要做的是为每个对象类别创建一个UInt32变量,并将其设置为(0x01<< x)(其中x是唯一的任何数字)。然后你要做的是将测试位掩码设置为你希望SKContacts命中的对象。像这样排序。

var c_Ball:UInt32 = (0x01 << 1)
var c_Fairy:UInt32 = (0x01 << 2)
var c_Human:UInt32 = (0x01 << 3)

var humantestbitmask = c_Fairy | c_Ball //SKPhysics contacts will only be made when the player hits a ball or fairy, not another human.