Пауза SKPhysicsWorld в Sprite Kit

Вот мой pause метод:

- (void)togglePaused
{
    self.paused = !self.paused;
    self.physicsWorld.speed = !self.paused;
}

...где self это SKScene,

Причина, по которой я включаю вторую строку, состоит в том, что я заметил, что во время бездействия все мои узлы с включенной физикой сразу же переместились вперед, как если бы физика продолжала работать в фоновом режиме, хотя сцена была приостановлена.

К сожалению, это не решает проблему.

Как вы можете приостановить SKScene и SKPhysicsWorld таким образом, чтобы при остановке физическое моделирование начиналось с того места, где оно остановилось?

1 ответ

Оказывается, вторая строка на самом деле не нужна. Проблема в том, что документация для didSimulatePhysics это неверно; Говорится:

вызывается ровно один раз за кадр, при условии, что сцена представлена ​​в виде и не приостановлена

Когда на самом деле он вызывается независимо от состояния паузы.

Поэтому основной метод паузы правильный. Вместо этого, если вы применяете модификации к вашему физическому моделированию, как я делал в каждом цикле обновления, тогда вы должны сначала проверить состояние паузы, например, так:

- (void)didSimulatePhysics
    if ( !self.paused ) {
        [parachute.physicsBody applyForce:CGVectorMake(0, 45) atPoint:CGPointMake(parachute.size.width/2, parachute.size.height)];
    }
}

(Если, конечно, не существует более канонического способа применения непрерывной физики, в этом случае неверная документация все еще остается в силе)

Другие вопросы по тегам