Пауза 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)];
}
}
(Если, конечно, не существует более канонического способа применения непрерывной физики, в этом случае неверная документация все еще остается в силе)