Изменить размер 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 отключить физические взаимодействия. Итак, однажды у вас есть внутренняя стена с ее телом, после того как вы можете скрыть внутреннюю часть, отключить физические взаимодействия и включить внешнюю стену с ее физикой.

О переходе между старой и новой границ стен вы можете изучить анимацию между двумя узлами.

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