Измените размер краев SKPhysicsBody и оставьте дочерние элементы внутри

У меня есть большой прямоугольный SKPhysicsBody, созданный с помощью SKPhysicsBody(edgeLoopFrom:...). Внутри этого физического тела находится куча шаров, которые подпрыгивают. Когда появляется уведомление, я показываю вид снизу экрана. Я хочу изменить размер SKPhysicsBody, чтобы шарики отскакивали от этого вида уведомления, пока оно отображается на экране.

Что я делаю сейчас

func updateWalls() {
    let wallInsets = UIEdgeInsetsMake(bottomWallInset, 0, 0, 0)
    scene.physicsBody = SKPhysicsBody(edgeLoopFrom:UIEdgeInsetsInsetRect(bounds, wallInsets))
}

Другими словами, я просто заменяю старое физическое тело новым с новыми измерениями. Это работает, за исключением того, что если какие-либо шары находятся в области между старыми измерениями и новыми измерениями, они застревают в ловушке, отскакивают от внешней стены и выпадают из мира.

Есть ли элегантный способ анимировать переход между старой и новой границами стены, чтобы любые шары, лежащие на дне, «перемещались» в новые измерения и гарантированно оставались внутри стены? Вы не можете масштабировать SKPhysicsBody напрямую.


person bcattle    schedule 15.02.2017    source источник


Ответы (2)


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

person simonWasHere    schedule 15.02.2017

У SpriteKit всегда были проблемы с масштабированием SKPhysicsBody, потому что physicsBody не остается прежним, между свойствами physicsBodies нет «непрерывности». Так что это не лучший способ.

Я хочу обратить ваше внимание на различие между узлами и физическими телами: вы можете построить 2 стены с его physicsBody, а когда вам не нужна одна из них, вы можете сделать ishidden = true, чтобы скрыть узел, и установить isDynamic = false, чтобы отключить физические взаимодействия. Итак, однажды у вас есть внутренняя стена с ее телом, после чего вы можете скрыть внутреннюю часть, отключить физические взаимодействия и включить внешнюю стену с ее физикой.

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

person Alessandro Ornano    schedule 15.02.2017
comment
Спасибо за помощь. Переход между двумя физическими телами будет таким же, как у меня сейчас, когда я просто заменяю одно другим. Я все еще застрял на том, как сделать анимацию, хотя. - person bcattle; 15.02.2017
comment
Попробуйте отключить физику тела на внутреннюю ноду, затем используйте внутреннюю ноду, чтобы сделать анимацию и стать похожей на внешнюю стену (но без physicsBody) и скрыть ее в конце (так покажите внешнюю ноду). В конце концов, сообщите о скрытом внутреннем узле его исходное измерение - person Alessandro Ornano; 15.02.2017