SpriteKit: didBeginContact вызывается круглосуточно на iPad
У меня есть очень простой проект, использующий SpriteKit, где монстр падает и пересекает платформу. На iPhone didBeginContact вызывается один раз, когда монстр попадает на платформу. Однако на iPad метод вызывается несколько раз в секунду, когда монстр скользит по платформе. Почему это нормально на iPhone, но глючит на iPad? Я тестировал как на симуляторе, так и на реальном iPad.
Вот где я настроил категории
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 вызывается постоянно. Я получаю журнал 5 раз каждую секунду, говоря, что монстр ударил по платформе. Мне нужно исправить это, когда я внедряю новые вещи позже.
if (firstBody.categoryBitMask == monsterCategory && secondBody.categoryBitMask == platformCategory) { NSLog(@"Monster Hit Platform"); }
2 ответа
enemy.physicsBody.restitution = 0;
platform.physicsBody.restitution = 0;
Это свойство "бодрости". Таким образом, когда враг и платформа сталкиваются, не будет небольших отскоков, вызывающих многократные события контакта.
Я также видел, что рекомендуется использовать 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)
}