双击spriteKit中的联系人通知

当我的SKSpriteNode命中与worldCategory有联系时,我似乎得到了一个双重通知,这是怎么回事? 这会产生问题,当我想要触摸worldCategory时,因为行动正在触发运行一个行动

这是我在InitWithSize方法中的位掩码

mover.physicsBody.categoryBitMask = birdCategory; bottom.physicsBody.categoryBitMask = worldCategory; mover.physicsBody.contactTestBitMask = worldCategory; 

这里是联系方式:

 - (void)didBeginContact:(SKPhysicsContact *)contact { if (contact.bodyA.categoryBitMask == worldCategory) { mover.texture = [SKTexture textureWithImageNamed:@"birddead1"]; NSLog(@"Contact"); self.scene.paused = YES; [pauseButton removeFromSuperview]; } } 

在我的日志中显示两行“联系”

将你的对象的restitution属性设置为零,如下所示:

 self.physicsBody.restitution = 0; //it's either self or the name of your object 

如果这不能解决您的问题,请查看与您的对象相关的移动代码。 寻找可能导致双重接触问题的“来回”运动。

作为最后的手段,您可以为您的联系人设置一个filter:

  1. 创build一个variables来存储联系人的时间。
  2. 在update:方法中比较联系variables时间与当前时间。
  3. 如果差异小于您指定的时间(例如0.2秒),则允许联系人并将您的联系时间variables设置为当前时间。 如果差值低于滤波时间(0.2秒),则忽略该接点。

我认为你可以试着更加具体地说明哪个身体是A,哪个是B,哪个是什么。 也许这样的事情:

 -(void)didBeginContact:(SKPhysicsContact *)contact { SKSpriteNode *firstNode, *secondNode; firstNode = (SKSpriteNode *)contact.bodyA.node; secondNode = (SKSpriteNode *) contact.bodyB.node; int bodyAA = contact.bodyA.categoryBitMask; int bodyBB = contact.bodyB.categoryBitMask; if ((bodyAA == birdCategory && (bodyBB == worldCategory)){ mover.texture = [SKTexture textureWithImageNamed:@"birddead1"]; NSLog(@"Contact"); self.scene.paused = YES; [pauseButton removeFromSuperview]; } } 

如果你使用的是iOS 7.1,你也可以在ViewController.m中设置skView.showsPhysics为YES,这样你就可以清楚地看到发生了什么。