目前我正在测试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
我错过了其他地方的东西吗?或者是否有更好的测试方法可以产生更一致的结果?
答案 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.