SpriteKit:didBeginContact在iPad上被称为不间断

我有一个使用SpriteKit的非常简单的项目,在这个项目中,一个怪物被丢弃并穿过一个平台。 在iPhone上,当怪物碰到平台时,didBeginContact会被调用一次。 但是,在iPad上,随着怪物在平台上滑动,该方法每秒被调用一次。 为什么在iPhone上的罚款,但在iPad上的错误? 我已经在模拟器和实际的iPad上进行了testing。

这是我设置类别的地方

static const uint32_t playerCategory = 0x1 << 0; static const uint32_t bulletCategory = 0x1 << 1; static const uint32_t monsterCategory = 0x1 << 2; static const uint32_t platformCategory = 0x1 << 3; static const uint32_t worldCategory = 0x1 << 4; 

这里是怪物的设置

 enemy.physicsBody.dynamic = YES; enemy.physicsBody.affectedByGravity = YES; enemy.physicsBody.allowsRotation = NO; enemy.physicsBody.categoryBitMask = monsterCategory; enemy.physicsBody.contactTestBitMask = worldCategory & platformCategory & bulletCategory; enemy.physicsBody.collisionBitMask = platformCategory; 

这是怪物如何被移动

 enemy.physicsBody.velocity = CGVectorMake(100, 0); 

这里是我如何知道didBeginContact被不断调用。 我每秒钟都会得到一个日志,说怪物打平台。 我需要解决这个问题,当我以后实施新的东西。

 if (firstBody.categoryBitMask == monsterCategory && secondBody.categoryBitMask == platformCategory) { NSLog(@"Monster Hit Platform"); } 

 enemy.physicsBody.restitution = 0; platform.physicsBody.restitution = 0; 

这是“快乐”的财产。 这样,当敌方和平台发生碰撞时,就不会有很小的反弹,触发多重接触事件。

我也看到,build议使用applyImpulse而不是手动设置速度。

做这个…

 var gameOver: Bool = false func didBeginContact(contact: SKPhysicsContact) { if(gameOver){ return } gameOverScene() } func gameOverScene(){ gameOver = true let GameSceneSet = GameOver(size: self.size) let reveal = SKTransition.crossFadeWithDuration(0.5) self.view?.presentScene(GameSceneSet, transition: reveal) }