Изменить размер SKPhysicsBody края и держать детей внутри
У меня большой прямоугольник SKPhysicsBody
создан с SKPhysicsBody(edgeLoopFrom:...)
, Внутри этого физического тела куча шариков, которые подпрыгивают. Когда появляется уведомление, я показываю вид снизу экрана. Я хочу изменить размер SKPhysicsBody
поэтому шары отражаются от этого представления уведомлений, пока оно находится на экране.
Что я делаю сейчас
func updateWalls() {
let wallInsets = UIEdgeInsetsMake(bottomWallInset, 0, 0, 0)
scene.physicsBody = SKPhysicsBody(edgeLoopFrom:UIEdgeInsetsInsetRect(bounds, wallInsets))
}
Другими словами, я просто заменяю старое физическое тело новым с новыми размерами. Это работает, за исключением того, что если какие-либо шары находятся в области между старыми измерениями и новыми измерениями, они попадают в ловушку и отскакивают от внешней стороны стены и выпадают из мира.
Существует ли изящный способ оживить переход между старой и новой границами стен, чтобы любые шары, лежащие внизу, "уносились" в новые измерения и гарантированно оставались внутри стены? Вы не можете масштабировать SKPhysicsBody
напрямую
2 ответа
В этой ситуации вместо изменения размера физического тела, вероятно, проще создать узел для представления уведомления. То есть создайте SKNode, который ничего не отображает, прикрепите к нему физическое тело того же размера, что и представление уведомлений, и просто переместите узел вместе с представлением уведомлений. Вы можете создать анимацию для движения узла с той же скоростью, что и анимация вида. Это должно дать необходимый эффект с меньшей вероятностью запутать физическое моделирование.
SpriteKit
всегда были проблемы с масштабированием SKPhysicsBody
Дело в том, что физические тела не остаются прежними, между свойствами физического тела нет "преемственности". Так что это не очень хороший способ.
Я хочу сосредоточить ваше внимание на различии между узлами и физическими телами: вы можете построить 2 стены с physicsBody
и когда вам не нужен один из них, вы можете сделать ishidden = true
скрыть узел и установить isDynamic = false
отключить физические взаимодействия. Итак, однажды у вас есть внутренняя стена с ее телом, после того как вы можете скрыть внутреннюю часть, отключить физические взаимодействия и включить внешнюю стену с ее физикой.
О переходе между старой и новой границ стен вы можете изучить анимацию между двумя узлами.