双击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:
- 创build一个variables来存储联系人的时间。
- 在update:方法中比较联系variables时间与当前时间。
- 如果差异小于您指定的时间(例如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,这样你就可以清楚地看到发生了什么。