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)
}
Другие вопросы по тегам